Python全局类属性
我想创建一个基类,它有一个不应该更改的属性。来自这个基类的任何派生类也应该具有这个属性。我的想法是:Python全局类属性,python,global,class-attributes,Python,Global,Class Attributes,我想创建一个基类,它有一个不应该更改的属性。来自这个基类的任何派生类也应该具有这个属性。我的想法是: class baseclass(object): flag = "some attr for all classes" def __init__(self, baseattr): self.baseattr = baseattr class child(baseclass): def __init__(self, baseattr, childattr
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"])
它应该返回“special attribute…baseclass”,但我得到的却是一个KeyError:
Traceback (most recent call last):
File "./test.py", line 14, in <module>
print(child.__dict__["flag"])
KeyError: 'flag'
回溯(最近一次呼叫最后一次):
文件“/test.py”,第14行,在
打印(子项._udict__[“标志”])
KeyError:“标志”
当调用基类时。_dict__['flag']
一切都很好。有没有一种方法可以为所有继承自基类的派生类设置标志?首先,我认为如果您能够回顾与基类相关的概念,以便理解 总的来说,您试图访问的
\uuu dict\uu
实现了对象名称空间。它不应该像您尝试的那样直接访问。但是为了理解,我将用它来说明类实例
与类对象
的区别
按原样调用\uuuu dict\uuuu
将获得包含子类对象属性的dict(默认属性和您在类定义中定义的属性):
>>>孩子。dict
dict_代理({'module':'main','doc':无,init':})
但是,当您决定像这样在基类中放置标志
时,您将其定义为基类
类对象的一部分。它不是每次都声明的,例如,它是在导入类定义后声明的。因此,如果您执行以下操作,您可以看到标志
:
>>>基类。dict
dict_代理({'module':'main,'flag':'some attr for all class','dict':,'weakref':,'doc':无,init':})
最后,如果访问对象实例\uuu dict\uuu
,您将看到使用self
声明的属性(包括调用super
时声明的baseattr
):
>>>child('some base attr','some child attr')。dict
{'childattr':'some child attr','baseattr':'some base attr'}
也就是说,您已经必须从任何对象实例访问标志
。更具体地说,您可以访问类定义、继承类定义和实例中定义的每个属性。因此,我真的建议您停止使用\uuuuu dict\uuuu
,并按照预期的方式访问内容:
>>>您的_obj_实例=child('some base attr','some child attr'))
>>>您的_obj_instance.childattr
“某个儿童属性”
>>>您的_obj_instance.baseattr
“一些基本属性”
>>>您的_obj_instance.flag
“所有类的某些属性”
拜托,我已经测试过了,似乎在这里工作。您使用的是flag还是baseattr???c
是一个子类:>>c.。\uuuu dict\uuuuu{'baseattr':12,'childattr':14}
,但我不想访问实例化类时传递的属性,但是我想访问在定义基类时已经定义的标志。您应该能够使用child.flag
来获取它。谢谢您的评论。我是一个自命不凡的人,因为我“被迫”使用python,而从未接受过python方面的教育。如果我犯了一些可以避免的错误,我很抱歉。问题是,我被迫根据类对象在实例化之前所具有的标志来决定如何处理该类对象。