动态地将实例方法绑定到Python中的类(而不是类实例)

问题描述 投票:1回答:2

描述和我尝试过的事情:

我已经在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

描述和我尝试过的事情:我已经在stackoverflow中看到很多关于将方法绑定到类实例的文章(我知道已经有很多重复的东西)。但是我还没有找到一个...

python python-3.x class python-decorators
2个回答
1
投票

如果您不介意更改所需的语法完全


0
投票

找到了另一种解决方法,我想下面会为我做。

© www.soinside.com 2019 - 2024. All rights reserved.