我想创建一个基类,该基类的属性不应更改。从该基类派生的任何类也应具有此属性。我的想法是:
class baseclass(object):
flag = "some attr for all classes"
def __init__(self, baseattr):
self.baseattr = baseattr
class child(baseclass):
def __init__(self, baseattr, childattr):
super(child, self).__init__(baseattr)
self.childattr = childattr
我的想法是,如果我知道看孩子。__dict __:
print(child.__dict__["flag"])
它应该返回“特殊属性...基类”,但我却收到KeyError:
Traceback (most recent call last):
File "./test.py", line 14, in <module>
print(child.__dict__["flag"])
KeyError: 'flag'
调用基类时。__dict __ ['flag'] 一切都好。有没有办法为所有继承自基类的派生类设置标志?
答案 0 :(得分:0)
首先,我认为如果您可以回顾与Class definition相关的概念,这样您就可以理解difference between a class instance and a class object。
总体而言,您尝试访问的__dict__
实现了对象名称空间。不应像尝试那样直接访问它。但是为了理解,我将用它来说明class instance
与class object
的区别。
像往常一样调用__dict__
将使您获得包含child
类对象的属性(默认属性和在类定义中定义的属性)的字典:
>>>孩子。字典
dict_proxy({'模块':'主要',' doc ':无,'初始化 ':})
但是,当您决定像以前一样将flag
放入baseclass
时,您将其定义为baseclass
类对象的一部分。例如,并不是每次都声明它,而是在导入类定义时声明它。因此,如果这样做,您可以看到flag
:
>>>基类。字典
dict_proxy({' module ':' main ','flag':'所有类的某些属性',' dict ' :,'弱引用':,' doc ':无,' init ':})
最后,如果访问对象实例__dict__
,则会看到用self
声明的属性(包括调用baseattr
时声明的super
):
>>> child(“某些基本属性”,“某些子属性”)。字典
{'childattr':'一些孩子attr','baseattr':'一些基本attr'}
话虽如此,您已经必须从任何对象实例访问flag
。更具体地说,您可以访问类定义,继承类定义以及实例中定义的每个属性。因此,我真的建议您停止使用__dict__
并按其预期的方式访问内容:
>>> your_obj_instance = child('一些基本attr','一些孩子attr')
>>> your_obj_instance.childattr
“一些儿童属性”
>>> your_obj_instance.baseattr
“一些基本属性”
>>> your_obj_instance.flag
“所有课程都有一些attr”