gpt4 book ai didi

python - 如何自动将python类中的 "register"方法作为列表类变量?

转载 作者:行者123 更新时间:2023-12-04 03:30:05 25 4
gpt4 key购买 nike

在定义 Python 类时,我想使用装饰器将它的一些方法注册到类变量列表中。这是一个错误的python示例,它概述了我正在寻找的内容:

class MyClass:

dangerous_methods = []

@classmethod
def dangerous_method(cls, func):
cls.dangerous_methods.append(func)
return func

@MyClass.dangerous_method
def incinerate(self):
pass

def watch_tv(self):
pass

@MyClass.dangerous_method
def stab(self):
pass

def print_dangerous_methods(self):
print(self.dangerous_methods)


obj = MyClass()
obj.print_dangerous_methods()
预期输出为
[<function MyClass.incinerate at 0x000001A42A629280>, <function MyClass.stab at 0x000001A42A629281>]
是否有可能在不过度折磨 Python 的情况下做到这一点?

最佳答案

您真正想要做的就是设置 dangerous在方法上。请记住,python 函数和方法是一流的对象,您可以对它们设置任意属性。

def print_dangerous_methods(cls):
""" yes, you could also return a list """
for name in dir(cls):
f = getattr(cls, name)
if callable(f) and getattr(f, "dangerous", False):
print(name)


def dangerous(func):
setattr(func, "dangerous", True)
return func

class MyClass:

@dangerous
def incinerate(self):
print("incinerate")

def watch_tv(self):
pass

@dangerous
def stab(self):
return "you've been stabbed"

class_born_dangerous = print_dangerous_methods

print("\non instance")
obj = MyClass()
print_dangerous_methods(obj)

print("\non class")
print_dangerous_methods(MyClass)

print("\nand yes, they work")
obj.incinerate()
print (obj.stab())

print("\nas a classmethod")
obj.class_born_dangerous()
输出:

on instance
incinerate
stab

on class
incinerate
stab

and yes, they work
incinerate
you've been stabbed

as a classmethod
incinerate
stab

如果要推广这种方法并设置任意属性,则需要设置参数化装饰器:
def annotate_func(**kwds):
"""set arbitrary attributes"""
def actual_decorator(func):
for k, v in kwds.items():
setattr(func, k, v)
return func
return actual_decorator
您将按如下方式使用:
    @annotate_func(dangerous=1,range=1000)
def shoot(self, times):
for i in range(0, times):
print("bang!")

关于python - 如何自动将python类中的 "register"方法作为列表类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67094773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com