gpt4 book ai didi

python - 如何在 Python 中查找装饰方法的包含类

转载 作者:太空狗 更新时间:2023-10-29 20:28:37 26 4
gpt4 key购买 nike

我正在尝试实现一个装饰器类,它会装饰其他类中的方法。但是,我需要包含装饰器中可用的装饰方法的类。我似乎无法在任何地方找到它。

这是一个例子:

class my_decorator(object):

def __init__(self, arg1, arg2):
print(self.__class__.__name__ + ".__init__")
self.arg1 = arg1
self.arg2 = arg2

def __call__(self, my_callable):
print(self.__class__.__name__ + ".__call__")
print(type(my_callable))
self.my_callable = my_callable
# self.my_callable_method_class = ?where to get this?

def function_wrapper(*args, **kwargs):
print(self.__class__.__name__ + ".function_wrapper")
print(self.arg1)
self.my_callable.__call__(*args, **kwargs)
print(self.arg2)

return function_wrapper


class MyClass(object):

@my_decorator(arg1="one", arg2="two")
def decorated_method(self):
print(self.__class__.__name__ + ".decorated_method")
print(type(self.decorated_method))
print("hello")


m = MyClass()
m.decorated_method()

这将打印出这个:

my_decorator.__init__
my_decorator.__call__
<type 'function'>
my_decorator.function_wrapper
one
MyClass.decorated_method
<type 'instancemethod'>
hello
two

在装饰器类中,可调用对象是函数类型,而在类本身内部,它是实例方法类型。我可以从 instancemethod 中获取 im_class,但函数中没有这样的东西。

如何从装饰器中获取包含装饰方法的类?

我可以这样做:

class my_decorator(object):

def __init__(self, cls, arg1, arg2):

.
.

class MyClass(object):

@my_decorator(cls=MyClass, arg1="one", arg2="two")
def decorated_method(self):

.
.

但我不想那样做,因为它是多余的而且不好。

或者我应该以其他方式实现吗?我基本上需要装饰器的几个参数,我需要装饰器中装饰方法的类。

最佳答案

您可以装饰:

@decorate
class MyClass(object):

@my_decorator(arg1="one", arg2="two")
def decorated_method(self):

并使用外部装饰器将类参数发送到内部。


你的提议都行不通,因为它们需要访问类在它存在之前。当您定义一个类时,您首先在其主体内执行代码(定义函数等),然后将结果范围分配给该类作为其 __dict__。所以在 decorated_method 被定义的时候,MyClass 还不存在。

关于python - 如何在 Python 中查找装饰方法的包含类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13394103/

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