Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何修饰函数以将其更改为类方法_Python_Decorator_Python Decorators - Fatal编程技术网

Python:如何修饰函数以将其更改为类方法

Python:如何修饰函数以将其更改为类方法,python,decorator,python-decorators,Python,Decorator,Python Decorators,我有这样的代码,我想写一个decorator,它将添加decorated函数作为类A的类方法 class A: pass @add_class_method(A) def foo(): return "Hello!" @add_instance_method(A) def bar(): return "Hello again!" assert A.foo() == "Hello!" assert A().b

我有这样的代码,我想写一个decorator,它将添加decorated函数作为类A的类方法

class A:
    pass

@add_class_method(A)
def foo():
    return "Hello!"

@add_instance_method(A)
def bar():
    return "Hello again!"

assert A.foo() == "Hello!"
assert A().bar() == "Hello again!"

这就是你想要的:

A类:
定义初始化(自):
通过
@类方法
def foo(cls):
回答“你好!”
def bar(自):
返回“你好!”
打印(A.foo())
打印(A().bar())
请阅读此处

class-MyClass:
def方法(自我):
#实例方法
返回'instance method called',self
@类方法
def cls_方法(cls):
#类方法
返回“调用的类方法”,cls
@静力学方法
def static_方法():
#静态法
返回“调用静态方法”
您需要实例化MyClass以访问(调用)实例方法

test=MyClass()
试验方法()
您可以直接访问类方法,而无需实例化

MyClass.cls_方法()
MyClass.static_方法()

这种方法怎么样?
另外,为了清晰起见,代码未进行结构优化

from functools import wraps


class A:
    pass


def add_class_method(cls):
    def decorator(f):
        @wraps(f)
        def inner(_, *args, **kwargs):
            return f(*args, **kwargs)

        setattr(cls, inner.__name__, classmethod(inner))

        return f

    return decorator


def add_instance_method(cls):
    def decorator(f):
        @wraps(f)
        def inner(_, *args, **kwargs):
            return f(*args, **kwargs)

        setattr(cls, inner.__name__, inner)

        return f

    return decorator


@add_class_method(A)
def foo():
    return "Hello!"


@add_instance_method(A)
def bar():
    return "Hello again!"


assert A.foo() == "Hello!"
assert A().bar() == "Hello again!"


你是说
@classmethod
?作者似乎想动态添加一个classmethod,我不这么认为。我猜它必须是类的方法,而不是@classmethod。不,我必须编写这两个装饰器的代码:add_class_方法和add_instance_方法。这段代码只是一个结果的示例。但是我的类在开始时应该是空的,我必须通过这些decorators def add_class_method(A):def real_decorator(func):def wrapper(*args,**kwargs):return func(*args,**kwargs)return wrapper()添加方法foo和bar归还真实的装饰师我已经通过了装饰师的课程,但我不知道如何用预定的方法归还。谢谢,答案解释得很好