擅长:python、mysql、java
<p>找到了另一个解决办法,我想下面会帮我的</p>
<pre><code>def quacks(some_class):
def quack(self, number_of_quacks):
self.number_of_quacks = number_of_quacks
old__init__ = some_class.__init__
def new__init__(self, *args, **kwargs):
setattr(self, "quack", types.MethodType(quack, self))
old__init__(self, *args, **kwargs)
setattr(some_class, "__init__", new__init__)
return some_class
</code></pre>
<p>请随意添加任何其他替代方案,或者如果您发现此方法存在任何缺点</p>
<p><strong>编辑:</strong>从@SethMMorton的答案中得到启发,采用了一种不那么粗俗的方式:</p>
<pre><code>
def quack(self, number_of_quacks):
self.number_of_quacks = number_of_quacks
def add_mixin(some_class, some_fn):
new_class = type(some_class.__name__, (some_class,), {
some_fn.__name__: some_fn
})
return new_class
def quacks(some_class):
return add_mixin(some_class, quack)
@quacks
class Duck:
pass
d1 = Duck()
d2 = Duck()
d1.quack(1)
d2.quack(2)
print(d1.number_of_quacks)
print(d2.number_of_quacks)
</code></pre>