gpt4 book ai didi

python - 使用 Mixin 扩展类属性

转载 作者:行者123 更新时间:2023-11-28 22:32:46 25 4
gpt4 key购买 nike

我想写一个 Mixin,它可以扩展最终的父类属性而不是替换它。示例:

class Base(object):
my_attr = ['foo', 'bar']

class MyMixin(object):
my_attr = ['baz']

class MyClass(MyMixin, Base):
pass

print(MyClass.my_attr)

['baz']

如何编写 MyMixinMyClass.my_attr['foo', 'bar', 'baz'] 为值?

答案可以是在 MyClass 中进行合并,但我想知道是否可以在 MyMixin 中进行合并。喜欢 MetaClass 或其他东西?

最佳答案

如果你真的想用mixin对类属性做这个,你必须使用自定义元类并将mixin放在mro中的Base之后(这意味着它不会覆盖基类中的任何内容,只需添加即可):

class Base(object):
my_attr = ['foo', 'bar']

class MyMixinBase(type):
def __init__(cls, name, parents, attribs):
my_attr = getattr(cls, "my_attr", None)
if my_attr is None:
cls.my_attr = ["baz"]
elif "baz" not in my_attr:
my_attr.append("baz")


class MyMixin(object):
__metaclass__ = MyMixinBase

class MyClass(Base, MyMixin):
pass

print(MyClass.my_attr)

这使得代码相当复杂......此时,仅使用 MyMixinBase 作为 MyClass 的元类会产生相同的结果:

class MyOtherClass(Base):
__metaclass__ = MyMixinBase

print(MyOtherClass.my_attr)

对于这样的用例,类装饰器工作得很好:

def with_baz(cls):
my_attr = getattr(cls, "my_attr", None)
if my_attr is None:
cls.my_attr = ["baz"]
elif "baz" not in my_attr:
my_attr.append("baz")
return cls

@with_baz
class AnotherClass(Base):
pass

print(AnotherClass.my_attr)

关于python - 使用 Mixin 扩展类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40610053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com