我想创建一个具有不应更改的属性的基类。来自这个基类的任何派生类也应该具有这个属性。我的想法是:
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
我的想法是,如果我知道,看看孩子__格言__:
print(child.__dict__["flag"])
它应该返回"特殊属性…基类",但我得到了一个KeyError:
Traceback (most recent call last):
File "./test.py", line 14, in <module>
print(child.__dict__["flag"])
KeyError: 'flag'
而在调用基类时__格言一切都很好。有没有办法为所有从基类继承的派生类设置标志?
首先,我认为如果你能回顾一下与类定义相关的概念,这样你就能理解类实例和类对象之间的区别,那就太好了。
总体而言,您尝试访问的__dict__
实现了对象名称空间。它不应该像你试图做的那样直接访问。但为了理解起见,我将用它来说明class instance
和class object
的区别。
按原样调用__dict__
将得到包含child
类对象属性的dict(默认属性和您在类定义中定义的属性(:
>>子级dict
dict_proxy({'module':'main','>doc":无,'init":}(
但是,当您决定像以前那样将flag
放在baseclass
中时,您将其定义为baseclass
类对象的一部分。它不是每次都声明的,例如,它是在导入类定义后声明的。因此,如果你这样做,你可以看到flag
:
>>基类dict
dict_proxy({'module':'main','flag':'所有类的某个属性','2dict":,'
weakref":,'doc:无,'init‘:}(
最后,如果访问对象实例__dict__
,您将看到用self
声明的属性(包括调用super
时声明的baseattr
(:
>>child(‘some base attr’,‘some child attr’(dict
{"childdattr":"一些子属性","baseattr":"某些基本属性"}
也就是说,您已经必须从任何对象实例访问flag
。更具体地说,您可以访问类定义、继承类定义和实例中定义的每个属性。因此,我真的建议您停止使用__dict__
,并按照预期的方式访问内容:
>your_obj_instance=child("一些基本属性","一些子属性"(
>>>您的实例子属性
"一些子属性">
>>>您的obj实例基本属性
"一些基本属性">
>>>your_obj_instance.flag
"所有类的某些属性">