Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python全局类属性_Python_Global_Class Attributes - Fatal编程技术网

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方面的教育。如果我犯了一些可以避免的错误,我很抱歉。问题是,我被迫根据类对象在实例化之前所具有的标志来决定如何处理该类对象。