我希望在以透明的方式从类中读取任何内容之前执行一个方法(这样调用者在写入类实例之前不必进行调用)。挂钩__getattr__
很简单,但我无法弄清楚如何挂钩__dict__
,因为object
没有__dict__
属性。
super().__dict__
提供'super' object has no attribute '__dict__'
也许我还应该做些什么来实现这个目标?
答案 0 :(得分:0)
你根本不想使用类的__dict__
,在大多数情况下(它在所有实例之间共享,请记住),并且你几乎肯定不会想要超类型的__dict__
,因为(正如你刚刚发现的那样,它不一定有一个。
>>> class One:
... def __init__(self):
... print(super().__dict__)
...
>>> one = One()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
AttributeError: 'super' object has no attribute '__dict__'
在您举报时,object
没有自己的__dict__
。这是因为object
个实例(内置类型)不允许获取其他属性,因此object
被硬编码为不允许它:
>>> object().someattr = "hello"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'someattr'
>>>
但是,在程序中创建对象的子类时,其实例可以采用任意属性,这些属性存储在实例__dict__
中。
>>> class Two:
... def __init__(self):
... print(self.__dict__)
...
>>> two = Two()
{}
>>> two.someattr = "hello"
>>> two.__dict__
{'someattr': 'hello'}
>>>
请注意,继承机制使Two
类看起来具有object
的所有属性。 dir()
函数允许您查看由继承修改的对象名称空间:
>>> dir(Two)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__']
选择随机属性,我们可以验证Two
上的方法是否实际上是从object
继承的:
>>> Two.__delattr__ is object.__delattr__
True
>>>