__dict__不了解某个类的某些属性

时间:2018-03-28 05:19:41

标签: python python-3.x class

如果我上课

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

然后在控制台中说

x=MyClass()
x.counter = 1
vars(x) # returns {'counter': 1}
x.__dict__ # returns {'counter': 1}

为什么它不知道x的i属性?我确信这是因为我对我在Python中如何定义类的各种属性的误解。

Python 2/3在这方面有什么区别吗?致电dir(x)会给我所有我期望的东西。

我怀疑其他初学者已经问过这个问题,但在这个阶段我不知道在问题标题中寻找正确的事情。网站建议的所有内容都不正确。

1 个答案:

答案 0 :(得分:5)

i被定义为的属性,而不是实例。您会发现只有MyClass.i的{​​{1}}个版本在MyClass的所有实例之间共享:

In [133]: x = MyClass()

In [134]: y = MyClass()

In [135]: x.i, y.i, MyClass.i
Out[135]: (12345, 12345, 12345)

In [136]: MyClass.i = 54321

In [137]: x.i, y.i, MyClass.i
Out[137]: (54321, 54321, 54321)

您还会发现i很好地坐在MyClass.__dict__内:

In [138]: vars(MyClass)
Out[138]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
              '__doc__': 'A simple example class',
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
              'f': <function __main__.MyClass.f>,
              'i': 54321})    # <------

请注意,类属性的另一个有趣特性是它们不与实例属性冲突:

In [148]: class MyClass:
     ...:     i = 12345
     ...:     def __init__(self):
     ...:         self.i = 54321
     ...:         

In [149]: x = MyClass()

In [150]: MyClass.i, x.i
Out[150]: (12345, 54321)