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

时间:2018-01-08 06:33:08

标签: 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):
        self.size=0
    def change_size(self,new):
        self.change_size.modifies = 'size'
        self.size=new

没了

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

没了

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

似乎没有任何效果。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

from functools import wraps

def attribute_decorator(**attrs):
    def attributes(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 attributes

并将您的课改写为

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