为什么"aClass.aProperty"不可调用?

Des*_*Des 11 python

class A:
  @property
  def p(self): return 2

  def q(self): return 2

a = A()
A.p(a) #>> TypeError: 'property' object is not callable

A.q(a) #>> no error, returns 2
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我理解如果我在一个实例上引用该属性:ap只会返回方法返回值,但我试图从该类的属性开始.我预计上面没有任何错误,两者都评估为2.

mgi*_*son 13

你在挖掘世界descriptors. A.p是一个property属性是描述符.它是一个具有魔术方法(__get__,__set__...)的类,当在实例上访问描述符时,它会被调用.访问的特定方法取决于当然如何访问它.访问类上的描述符只会返回描述符本身并且不会执行任何魔术 - 在这种情况下,property描述符不可调用,因此您会收到错误.

请注意如果您致电会发生什么__get__:

class A(object):
    @property
    def p(self):  
        return 2

a = A()
print (A.p.__get__(a)) #2
Run Code Online (Sandbox Code Playgroud)

foo = A.p.__get__(a)当你这样做时,真正发生在引擎盖下的是什么foo = a.p.我觉得这很漂亮......


Mar*_*cin 7

因为属性不可调用:

In [3]: class A(object):
   ...:   @property
   ...:   def p(self): return 2
   ...:

In [4]: A.p
Out[4]: <property at 0x2d919a8>

In [5]: dir(A.p)
Out[5]:
['__class__',
 '__delattr__',
 '__delete__',
 '__doc__',
 '__format__',
 '__get__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__set__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'deleter',
 'fdel',
 'fget',
 'fset',
 'getter',
 'setter']
Run Code Online (Sandbox Code Playgroud)

注意缺少一种__call__方法.这是因为属性可以包含多个函数.

如果您尝试将该属性作为实例上的方法调用,会发生以下情况:

In [6]: a = A()

In [7]: a.p()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Users\Marcin\<ipython-input-7-16c8de382321> in <module>()
----> 1 a.p()

TypeError: 'int' object is not callable
Run Code Online (Sandbox Code Playgroud)


dm0*_*514 2

属性装饰器将你的方法变成一个属性,它不再是一个函数对象,而是一个property,因此不可调用

  • 那怎么称呼呢? (4认同)