非类中的属性方法

时间:2018-02-21 11:01:33

标签: python class memory properties attributes

class Parrot:
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

我有上面的代码(找到here),我希望了解是否有任何可用性来不调用该类并获得以下结果。

>>> Parrot.voltage
<property at 0x7f19e83cdf48>

我明白通常会是

>>> Parrot().voltage
100000

对于可用性,我的意思是Parrot.voltage有许多@property可用的方法,例如deleter, fdel, getter等。但是,我不了解如何使用这些方法。

1 个答案:

答案 0 :(得分:0)

  

我希望了解是否有任何可用性来不调用该类并获得以下结果。

>>> Parrot.voltage
<property at 0x7f19e83cdf48>

好吧,你可以问一个关于在类上查找方法时获取函数的相同问题,即:

bruno@bigb:~$ python3
>>> class Foo():
...     def bar(self):
...         return 42
... 
>>> Foo.bar
<function Foo.bar at 0x7fab209c5510>

在此示例中,您可以保留对此函数的引用,并在稍后将Foo实例作为self参数传递给它:

>>> f = Foo.bar
>>> foo = Foo()
>>> f(foo)
42
>>> 

这实际上就是Python在实例上调用方法时所做的事情(使用foo.bar()而不是Foo.bar(foo))。您可以对property对象执行相同的操作:

>>> class Parrot:
...     def __init__(self):
...         self._voltage = 100000
...     @property
...     def voltage(self):
...         """Get the current voltage."""
...         return self._voltage
... 
>>> p = Parrot()
>>> Parrot.voltage.__get__(p)
100000
>>> 

再一次,这就是Python在看到类似的东西时所做的事情:

>>> p.voltage

FWIW,python的函数也是描述符,所以foo.bar()的实际等价实际上是Foo.bar.__get__(foo)()

所有这些看起来都没用,而且你通常不会使用方法或属性 - 你只是在实例上查找它们,而不是在类上查找它们,让Python做一些笨拙的工作。但是,根据几个简单的概念(类,元类,可调用和属性解析规则 - 包括描述符协议)实现整个对象模型,使语言具有高度动态性,并提供了挂钩整个机制并对其进行自定义的机会。作为一个例子(我的意思是一般例子),通过大大减少样板,这对于框架代码特别方便。