【问题标题】:__dict__ doesn't know about certain attributes of a class [duplicate]__dict__ 不知道类的某些属性[重复]
【发布时间】:2018-03-28 05:19:41
【问题描述】:

如果我上课

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) 给了我所有我期望的东西。

我怀疑其他初学者已经问过这个问题,但在这个阶段我不知道在问题标题中寻找正确的东西。该网站建议的建议似乎都不正确。

【问题讨论】:

    标签: python python-3.x class


    【解决方案1】:

    i 被定义为 class 的属性,而不是 instance。您会看到只有一个版本的MyClass.iMyClass 的所有实例之间共享:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2011-06-20
      • 1970-01-01
      • 2012-02-27
      • 2023-02-24
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多