在Python中的几个类之间共享类属性

时间:2014-07-22 15:31:05

标签: python class-attributes

我有一个包含类属性的类。我需要它们由一组其他类共享为类属性,因此如果它们中的任何一个修改了这些属性,它们将被修改为所有这些属性。我天真地尝试使用继承,但它不是那样工作:每个类的行为就好像它有自己的那些类属性的“副本”。

文件:

# baseClass.py 
class BaseClass(object):
    iden = 0


# child1.py 
from baseClass import BaseClass

class Child1(BaseClass):
    @classmethod
    def getId(cls):
        return cls.iden


# child2.py
from baseClass import BaseClass

class Child2(BaseClass):
    @classmethod
    def getId(cls):
        return cls.iden

我用来测试它的文件是:

from child1 import Child1
from child2 import Child2

print(Child1.getId()) 
Child1.iden = 5
print(Child1.getId())
print(Child2.getId())

我看到的输出:

0
5
0

我应该怎么做,以便Child1,Child2和BaseClass共享iden类属性?

3 个答案:

答案 0 :(得分:2)

试试这个:

# baseClass.py 
class BaseClass(object):
    iden = 0
    @classmethod
    def set_id(cls, id):
        BaseClass.iden = id

你可以这样称呼:

Child1.set_id(5)

答案 1 :(得分:1)

您可以通过向iden的元类添加BaseClass属性来执行此操作:

class BaseType(type):
    _iden = 0
    def _get_iden(cls):
        return BaseType._iden
    def _set_iden(cls, value):
        BaseType._iden = value
    iden = property(_get_iden, _set_iden)

class BaseClass(object):
    __metaclass__ = BaseType

class Child1(BaseClass):
    pass

class Child2(BaseClass):
    pass

print Child1.iden
Child1.iden = 5
print Child1.iden
print Child2.iden

输出:

0
5
5

答案 2 :(得分:0)

我不会使用继承。如果您确实需要更改Child1Child2中的属性,还可以使用__setattr__并更改基类的属性。我不建议这样做......在我看来,设计中存在一些问题。为什么需要更改孩子的属性?也许你想添加一个包含这个属性的新类,所有其他类都会引用它?

据我了解,以下情况应该适用于您的情况:

# baseClass.py 
class BaseClass(object):

    def initializeIden():
        # Do some initialization
        BaseClass.iden = 0


# child1.py 
from baseClass import BaseClass

class Child1:
    @classmethod
    def getId(self):
        if not hasattr(BaseClass, "iden"):
            BaseClass.initializeIden()
        return BaseClass.iden


# child2.py
from baseClass import BaseClass

class Child2(BaseClass):
    @classmethod
    def getId(self):
        if not hasattr(BaseClass, "iden"):
            BaseClass.initializeIden()
        return BaseClass.iden