0

我试图更多地了解 python 类和描述符是如何工作的。我有以下代码。

class Base():
    def __init__(self):
        self.a = 'base_a'

    def get_a(self):
        return self._x
    def set_a(self,val):
        self._x = val 
    def delete_a(self):
        pass

    a = property(get_a,set_a,delete_a)

class Derived(Base):
    def __init__(self):
        Base.__init__(self)

    @property
    def a(self):
        return 'derived_a'


t = Derived()
print(t.a)

在 Python 2.7 中运行,我得到

[carl@home tmp-carl]$ python2.7 test.py 
base_a

在 Python 3.3 中运行,我得到

[carl@home tmp-carl]$ python3 test.py 
Traceback (most recent call last):
  File "test.py", line 25, in <module>
    t = Derived()
  File "test.py", line 18, in __init__
    Base.__init__(self)
  File "test.py", line 5, in __init__
    self.a = 'base_a'
AttributeError: can't set attribute

我想我理解 Python3.3 的行为。t 是 Derived 的一个实例,因此Base::__init__搜索t.__dict__['a'],没有找到它。它转到Derived.__dict__['a'],找到只读属性和错误。它永远不会成为可Base.__dict__['a']读写的。

但如果这是真的,我完全不明白为什么 Python2.7 可以工作。似乎它完全忽略了Derived.

谁能给我解释一下?

4

1 回答 1

5

Python 2.x 有两种类型的类:old-style 和 new-style。描述符(其中property之一)仅适用于新式类。为了在 2.x 中创建新样式的类,您必须从object.

class Base(object):

3.x 中的所有类都是新型类。

于 2012-12-15T02:28:17.823 回答