我有一个包含类属性的类。我需要它们由一组其他类共享为类属性,因此如果它们中的任何一个修改了这些属性,它们将被修改为所有这些属性。我天真地尝试使用继承,但它不是那样工作:每个类的行为就好像它有自己的那些类属性的“副本”。
文件:
# 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类属性?
答案 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)
我不会使用继承。如果您确实需要更改Child1
和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