Python3可变静态类成员

奥姆里·阿布(Omri Abu)

我需要使用变量的静态类函数,并且所有可用的类都将从具有所有常用方法和变量的单个父级继承。

当前的行为是,父级中定义的类变量并非对每个子级都有影响,而是在所有子级之间共享(需要作为离散变量)

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']

(或者是你真的想NoneParent.cls_var?)

我承认这比您的解决方法更冗长,但(对我而言)它看起来更pythonic ...


更新

正如Blckknght所指出的,元类可以(可能应该)看起来更简单:

class MutableClassVarMeta(type):
    def __init__(cls, name, bases, attrs):
        cls.cls_var = []

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章