如果你真的想這樣做的類與混合料攪拌屬性,你必須使用自定義的元類,把混入Base
後的MRO(這意味着它不會重寫基類的東西,只是給它添加):
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)
你的回答正是我所希望的。 – bux
@bux很高興有任何幫助 - 現在(只是出於好奇)你會關心分享哪三個「解決方案」解決你的問題?) –
我添加了python3版本到您的答案 – bux