说明和;我的尝试:
我在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
如果您不介意完全更改所需的语法以获得所需的功能,那么可以使用^{} 动态构造类(请参见第二个签名)
第一个参数是类的名称,第二个参数是超类的元组,第三个参数是要添加的属性字典
因此,与创建后注入适当功能的装饰器不同,您只需在创建时直接添加功能。这种方法的好处在于,您可以通过编程方式构建属性字典,而使用decorator则不行
找到了另一个解决办法,我想下面会帮我的
请随意添加任何其他替代方案,或者如果您发现此方法存在任何缺点
编辑:从@SethMMorton的答案中得到启发,采用了一种不那么粗俗的方式:
相关问题 更多 >
编程相关推荐