我可以在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