Python全局类属性

时间:2018-12-11 14:45:47

标签: 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):
        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'] 一切都好。有没有办法为所有继承自基类的派生类设置标志?

1 个答案:

答案 0 :(得分:0)

首先,我认为如果您可以回顾与Class definition相关的概念,这样您就可以理解difference between a class instance and a class object

总体而言,您尝试访问的__dict__实现了对象名称空间。不应像尝试那样直接访问它。但是为了理解,我将用它来说明class instanceclass 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”