我可以在Python中向类方法添加属性吗?

我可以在Python中向类方法添加属性吗?,python,class,attributes,Python,Class,Attributes,我有一门课是这样的: class A: def __init__(self): self.size=0 def change_size(self,new): self.size=new 我想在change_size方法中添加一个属性来说明它所更改的内容,即 A(blah) blah.change_size.modifies 返回 'size' 这可能吗?我试过: class A: def __init__(self):

我有一门课是这样的:

class A:
    def __init__(self):
        self.size=0
    def change_size(self,new):
        self.size=new
我想在change_size方法中添加一个属性来说明它所更改的内容,即

A(blah)
blah.change_size.modifies
返回

'size'
这可能吗?我试过:

class A:
    def __init__(self):
        self.size=0
    def change_size(self,new):
        self.change_size.modifies = 'size'
        self.size=new
没有

没有


所有这些似乎都不起作用。

这很简单。基本上与向任何其他函数添加属性的方式相同:

class A:
    def __init__(self):
        self.size=0
    def change_size(self,new):
        self.size=new
    change_size.modifies = 'size'

print(A.change_size.modifies) # prints size

具有帮助装饰器的更通用的解决方案

from functools import wraps

def attributes(**attrs):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            return f(*args, **kwargs)

        for attr_name, attr_value in attrs.items():
            setattr(wrapper, attr_name, attr_value)

        return wrapper

    return decorator
把你的课改写成

class A:
    def __init__(self):
        self.size = 0

    @attributes(modifies='size')
    def change_size(self, new):
        self.size = new

您遇到的问题的可能重复之处在于
self.change\u size
是一个将
self
传递给方法而不是方法本身的包装器。你需要通过类而不是实例来完成这项工作。。。那很简单!您在这里很快就解决了我的问题,所以我必须等待,然后才能将您的答案标记为正确答案。hahaMy答案没有设置类属性。在类范围中设置类属性类似于
change\u size\u modifies='size'
,而不是
change\u size.modifies='size'
。另外,decorator中的
包装器
是不必要的(您可以在原始
f
上设置属性并返回
f
),并且语法无效;您不应该引用
modifies
。感谢您提醒语法错误,上一个答案已更新。您的
包装器
正在将错误参数传递给
f
;它应该是
f(*args,**kwargs)
,而不是
f(args,kwargs)
from functools import wraps

def attributes(**attrs):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            return f(*args, **kwargs)

        for attr_name, attr_value in attrs.items():
            setattr(wrapper, attr_name, attr_value)

        return wrapper

    return decorator
class A:
    def __init__(self):
        self.size = 0

    @attributes(modifies='size')
    def change_size(self, new):
        self.size = new