我需要使用变量的静态类函数,并且所有可用的类都将从具有所有常用方法和变量的单个父级继承。
当前的行为是,父级中定义的类变量并非对每个子级都有影响,而是在所有子级之间共享(需要作为离散变量)
class Parent(object):
cls_var = list()
@classmethod
def cls_mthd(cls, a):
cls.cls_var.append(a)
class ChildA(Parent):
pass
ChildA.cls_mthd('A')
class ChildB(Parent):
pass
ChildB.cls_mthd('B')
print(Parent.cls_var)
print(ChildA.cls_var)
print(ChildB.cls_var)
输出量
['A', 'B']
['A', 'B']
['A', 'B']
解决此问题的一种方法是设法解决此问题,但我认为这种破解方法并非最佳选择
class Parent(object):
cls_var = dict()
@classmethod
def cls_mthd(cls, a):
if cls.__name__ not in cls.cls_var:
cls.cls_var[cls.__name__] = list()
cls.cls_var[cls.__name__].append(a)
@classmethod
def tst(cls):
return cls.cls_var[cls.__name__] if cls.__name__ in cls.cls_var else None
class ChildA(Parent):
pass
ChildA.cls_mthd('A')
class ChildB(Parent):
pass
ChildB.cls_mthd('B')
print(Parent.tst())
print(ChildA.tst())
print(ChildB.tst())
输出量
None
['A']
['B']
为了具有可变的静态类成员,您可以使用元类:
class MutableClassVarMeta(type):
def __new__(meta, name, bases, namespace, **kwds):
cls = super().__new__(meta, name, bases, namespace, **kwds)
cls.cls_var = []
return cls
class Parent(metaclass=MutableClassVarMeta):
@classmethod
def cls_mthd(cls, a):
cls.cls_var.append(a)
class ChildA(Parent):
pass
class ChildB(Parent):
pass
ChildA.cls_mthd('A')
ChildB.cls_mthd('B')
print(Parent.cls_var) # []
print(ChildA.cls_var) # ['A']
print(ChildB.cls_var) # ['B']
(或者是你真的想None
为Parent.cls_var
?)
我承认这比您的解决方法更冗长,但(对我而言)它看起来更pythonic ...
更新
正如Blckknght所指出的,元类可以(可能应该)看起来更简单:
class MutableClassVarMeta(type):
def __init__(cls, name, bases, attrs):
cls.cls_var = []
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句