【问题标题】:python property and new class stylepython属性和新的类样式
【发布时间】:2014-01-07 03:30:35
【问题描述】:

我尝试像流动一样使用属性装饰器及其设置器

class Circle:

    def __init__(self, radius=0):
        self.__radius = radius 

    @property
    def radius(self):
        return self.__radius

    @radius.setter
    def radius(self, radius):
        if (radius > 0):
            self.__radius = radius
        else:
            raise ValueError

c = Circle()
c.radius = -1

但是在 python 2.x 中什么都没有发生。
只有 python 3.x 可以引发 ValueError。

但是,我发现了这个post
该帖子建议使用新的类样式(继承对象),
但我不知道新类风格中的哪些功能可以让它发挥作用。
我想知道属性和对象的关系。

【问题讨论】:

  • 我在 2.7.6 中收到 ValueError。
  • 上面的代码在 python 2.7 中引发了 ValueError。因为您已经在使用新的样式类(通过继承对象)。为什么要避免使用新样式对象?
  • 这是您尝试的实际代码吗?该类继承自object;当您实际尝试时,您还记得从object 继承吗?如果可能的话,从实际的源文件中复制/粘贴您的代码。
  • 我不想避免使用新样式。我只是想知道为什么新风格可以奏效。
  • 对不起,我的原始帖子中的代码已经使用了新的类样式。我更新了它,它现在不能在 2.x 中工作。

标签: python python-3.x properties python-2.x


【解决方案1】:

属性是描述符。 The documentation 描述了描述符功能的“来源”:

对于对象,机器位于object.__getattribute__() 中,它将b.x 转换为type(b).__dict__['x'].__get__(b, type(b))

属性不适用于旧式类,因为旧式类不继承自 object,而且正如那句话所说,使描述符工作的机制由 object 提供。

没有直接的方法可以将此功能添加到旧式类中,因为__getattribute__ 也不适用于旧式类。您必须存储一些单独的属性字典,然后使用__getattr__ 将属性访问映射到它们。但是,没有理由这样做,因为没有理由不每次都使用新样式的类。

【讨论】:

  • 那么,换句话说,如果我实现了半径描述符,它会起作用吗?
  • @FreedomKnight:关键是你不能只在radius 上这样做。类本身必须提供基础设施。我在答案中添加了一些内容,但我不明白您的目标是什么。总是使用新式类,忘记旧式类甚至存在。
  • 我的目标只是想知道python中的机制。我不想知道如何使用,但知道这些背后的东西。最后,谢谢你的回答
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多