在Python中将属性添加到类时执行方法
我想实例化一个类,比如说,在Python中将属性添加到类时执行方法,python,class,python-2.7,methods,setattr,Python,Class,Python 2.7,Methods,Setattr,我想实例化一个类,比如说,Fighter,带有和不带属性武器大小。但是当属性武器大小被设置时(无论是在实例化时还是以后),我想运行一些方法来添加另一个属性伤害(可能还会进行一些其他计算)。我试图通过如下重载setattr函数来实现这一点 我的问题是:这是正确的(明智的)方式吗 class Fighter(object): def __init__(self, prenom, weapon_size = None): self._prenom = prenom
Fighter
,带有和不带属性武器大小
。但是当属性武器大小
被设置时(无论是在实例化时还是以后),我想运行一些方法来添加另一个属性伤害
(可能还会进行一些其他计算)。我试图通过如下重载setattr函数来实现这一点
我的问题是:这是正确的(明智的)方式吗
class Fighter(object):
def __init__(self, prenom, weapon_size = None):
self._prenom = prenom
self._weapon_size = weapon_size
if not weapon_size is None:
self.AddWeapon(weapon_size)
def __setattr__(self, name, value):
if name == "weapon_size":
print "Adding weapon"
self.AddWeapon(value)
self.__dict__['_' + name] = value
else:
self.__dict__[name] = value
def AddWeapon(self, x):
self._damage = x/2.
@property
def weapon_size(self):
"Weapon size"
return self._weapon_size
@property
def prenom(self):
"First name"
return self._prenom
U = Fighter('Greg')
U.weapon_size = 9
print U.weapon_size, U._damage
>> 9 4.5
W = Fighter('Jeff', weapon_size = 11)
print W.weapon_size, W._damage
>> 11 5.5
可以为特定属性定义自定义设置器
@weapon_size.setter
def weapon_size(self, value):
# custom code here
self._weapon_size = value
编辑:但实际上,在一天结束时,我认为你只需做以下几件事就更干净了:
class Fighter(object):
def __init__(self, prenom, weapon_size=None):
...
self.weapon_size = weapon_size
...
@property
def damage(self):
if self.weapon_size:
return self.weapon_size / 2
return None
太好了,谢谢。我可以问一下,使用setattr的缺点是什么?我处理不该处理的案例?因为属性基本上是为您试图解决的问题创建的。如果可能,应始终避免重写任何
\uuuuuuuuuuuuuuuuuuux
方法。使用\uuuuu setattr\uuuuu
修改为所有属性调用的方法,而您所关心的只是武器大小
。这样更精确。