【发布时间】:2020-07-17 13:54:31
【问题描述】:
描述和我的尝试:
我在 stackoverflow 中看到了很多关于将方法绑定到类实例的帖子(我知道已经有很多重复项了)。
但是我还没有找到关于将方法绑定到类本身的讨论。我可以想到解决方法,但我很好奇是否有一种简单的方法可以实现以下目标:
import types
def quacks(some_class):
def quack(self, number_of_quacks):
self.number_of_quacks = number_of_quacks
setattr(some_class, "quack", types.MethodType(quack, some_class))
return some_class
@quacks
class Duck:
pass
但上面的行不通:
d1 = Duck()
d2 = Duck()
d1.quack(1)
d2.quack(2)
print(d2.number_of_quacks)
# 2
print(d1.number_of_quacks)
# 2
因为 quack 实际上是在修改类本身而不是实例。
我能想到两种解决方法。如下所示:
class Duck:
def __init__(self):
setattr(self, "quack", types.MethodType(quack, self))
或类似的东西
class Quacks:
def quack(self, number_of_quacks):
self.number_of_quacks = number_of_quacks
class Duck(Quacks):
pass
问题:
所以我的问题是,有没有一种简单的方法来实现我上面描述的简单的@quacks 类装饰器?
为什么要问: 我打算创建一组函数来模块化地将我使用的常用方法添加到类中。如果我不退出这个项目,该列表可能会随着时间的推移而增长,我希望它在代码定义上看起来不错。从口味上看,我认为下面的选项 1 看起来比选项 2 更好:
# option 1
@quacks
@walks
@has_wings
@is_white
@stuff
class Duck:
pass
# option 2
class Duck(
Quacks,
Walks,
HasWings,
IsWhite,
Stuff):
pass
【问题讨论】:
-
选项 2 中提出的模式有一个名称,它们被称为“mix-ins”。这是一个关于它的 SO Q/A:stackoverflow.com/questions/533631/…
标签: python python-3.x class python-decorators