0

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

文件:

# 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 类属性?

4

3 回答 3

2

尝试这个:

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

你可以这样称呼它:

Child1.set_id(5)
于 2014-07-22T15:48:16.740 回答
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
于 2014-07-22T15:48:02.103 回答
0

我不会使用继承。如果你真的需要从Child1and改变属性,Child2你也可以使用__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
于 2014-07-22T15:59:09.087 回答