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
等。但是,我不了解如何使用这些方法。
答案 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做一些笨拙的工作。但是,根据几个简单的概念(类,元类,可调用和属性解析规则 - 包括描述符协议)实现整个对象模型,使语言具有高度动态性,并提供了挂钩整个机制并对其进行自定义的机会。作为一个例子(我的意思是一般例子),通过大大减少样板,这对于框架代码特别方便。