我想了解内置功能的property
工作原理。令我感到困惑的是,property
它还可以用作装饰器,但是仅当用作内置函数时才接受参数,而不能用作装饰器。
这个例子来自文档:
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
property
的论点是getx,setx,delx
和文档字符串。
在下面的代码中property
用作装饰器。它的对象是x
函数,但是在上面的代码中,参数中没有对象函数的位置。
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
并且,x.setter
和x.deleter
装饰器是如何创建的?我很困惑。
该property()
函数返回一个特殊的描述符对象:
>>> property()
<property object at 0x10ff07940>
正是这种对象有额外的方法:
>>> property().getter
<built-in method getter of property object at 0x10ff07998>
>>> property().setter
<built-in method setter of property object at 0x10ff07940>
>>> property().deleter
<built-in method deleter of property object at 0x10ff07998>
这些充当装饰过。他们返回一个新的属性对象:
>>> property().getter(None)
<property object at 0x10ff079f0>
那是旧对象的副本,但是替换了其中一个功能。
记住,@decorator
语法只是语法糖。语法:
@property
def foo(self): return self._foo
确实与
def foo(self): return self._foo
foo = property(foo)
因此foo该函数被替换property(foo)
,我们在上面看到的是一个特殊的对象。然后,当你使用时@foo.setter(),你正在做的事情就是调用property().setter
我上面显示的方法,该方法将返回该属性的新副本,但是这次将setter函数替换为装饰方法。
下面的序列还通过使用那些装饰器方法创建了一个全开属性。
首先,我们property
仅使用getter
创建一些函数和一个对象:
>>> def getter(self): print('Get!')
...
>>> def setter(self, value): print('Set to {!r}!'.format(value))
...
>>> def deleter(self): print('Delete!')
...
>>> prop = property(getter)
>>> prop.fget is getter
True
>>> prop.fset is None
True
>>> prop.fdel is None
True
接下来,我们使用该.setter()方
法添加setter
:
>>> prop = prop.setter(setter)
>>> prop.fget is getter
True
>>> prop.fset is setter
True
>>> prop.fdel is None
True
最后,我们使用以下.deleter()
方法添加删除器:
>>> prop = prop.deleter(deleter)
>>> prop.fget is getter
True
>>> prop.fset is setter
True
>>> prop.fdel is deleter
True
最后但并非最不重要的一点是,该property对象充当描述符对象,因此具有和.__get__()
,可以.__set__()
与.__delete__()
实例属性的获取,设置和删除方法挂钩:
>>> class Foo: pass
...
>>> prop.__get__(Foo(), Foo)
Get!
>>> prop.__set__(Foo(), 'bar')
Set to 'bar'!
>>> prop.__delete__(Foo())
Delete!
Descriptor Howto包括以下类型的纯Python示例实现property():
class Property:
"Emulate PyProperty_Type() in Objects/descrobject.c"
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
if doc is None and fget is not None:
doc = fget.__doc__
self.__doc__ = doc
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
def __delete__(self, obj):
if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(obj)
def getter(self, fget):
return type(self)(fget, self.fset, self.fdel, self.__doc__)
def setter(self, fset):
return type(self)(self.fget, fset, self.fdel, self.__doc__)
def deleter(self, fdel):
return type(self)(self.fget, self.fset, fdel, self.__doc__)
本文向大家介绍Python @property装饰器原理解析,包括了Python @property装饰器原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python @property装饰器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.通过@property装饰器,可以直接通过方法名来访问方法,不需要在方法名后
问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的
问题内容: 我试图在类中的字典上使用Python的装饰器。我的想法是我希望在访问某个值后将其清除(称为“消息”)。但是我还希望另一个值(称为“ last_message”)包含最后设置的消息,并将其保留直到设置了另一个消息。在我看来,此代码将有效: 但是,它似乎没有: 我不确定自己做错了什么?在我看来,这似乎不像我期望的那样起作用,但是也许我在做其他根本上错误的事情? 另外,我知道我可以在类中使用
问题内容: 这是python装饰器的示例。我无法理解它的工作方式。请向我解释给定示例的控制流程。我将非常有义务。 问题答案: 装饰器是在Python中应用高阶函数的语法糖。高阶函数是将一个或多个函数作为输入并返回一个函数的函数。即 这里是一个高阶函数,它接受单个参数的函数,并返回单个参数的函数。您可以将其视为修改的行为。 高阶函数是可组合的(根据定义),因此在您的特定示例中,装饰器语法, 等价于
本文向大家介绍如何真正的了解python装饰器,包括了如何真正的了解python装饰器的使用技巧和注意事项,需要的朋友参考一下 合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。 一、不带参数的装饰器 我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is
主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面