Python全局类属性



我想创建一个具有不应更改的属性的基类。来自这个基类的任何派生类也应该具有这个属性。我的想法是:

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 instanceclass 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

"所有类的某些属性">

相关内容

  • 没有找到相关文章

最新更新