【问题标题】:Property methods in not-called class未调用类中的属性方法
【发布时间】:2018-07-31 22:25:35
【问题描述】:
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等。但是我不明白如何使用这些。

【问题讨论】:

  • 创建对象有什么问题。如果没有对象类,则不会初始化,因此无法获取这些值
  • 你是什么意思“任何可用性”?这只是属性实现方式的产物,作为类上的 descriptor 而不是实例上的属性。
  • p = Parrot 只是让p 成为Parrot 的引用,因此x = p() 将等同于x = Parrot()

标签: python class memory properties attributes


【解决方案1】:

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

>>> 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 完成繁重的工作。但是,根据几个简单的概念(类、元类、可调用对象和属性解析规则——包括描述符协议)来实现整个对象模型,使得语言高度动态化,并提供了与整个机制挂钩并对其进行定制的机会。作为一个例子(我的意思是一般例子),这对于框架代码来说特别方便,因为它大大减少了样板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多