我正在尝试根据给定的参数修改类属性。我刚刚进入python但我似乎无法在不使用字典的情况下找到方法。有没有pythonic方式来做到这一点?见下面的例子
class Ship:
def __init__(self, name):
self.name = name
ship_type = {"schooner": [50, 30, 18],
"galleon": [30, 14, 14]
}
self.max_weight = ship_type[name][0]
self.speed = ship_type[name][1]
self.poopdeck = ship_type[name][2]
def upgrade(self, attribute, value):
self.attribute += value
Someship.ship.upgrade(speed, 10)
我可以为每个属性写出不同的方法,但我觉得好像必须有这样的东西。
如果已经回答,我会提前道歉,但如果有的话我无法说出来。
答案 0 :(得分:0)
您正在寻找setattr
和getattr
功能。您的upgrade
方法可以实现为
def upgrade(self, attribute, value):
setattr(self, attribute, getattr(self, attribute) + value )
答案 1 :(得分:0)
使用builtin functions hasattr()
,setattr()
和getattr()
更改更新方法以更新现有属性。
def upgrade(self, attribute, value):
if hasattr(self, attribute):
setattr(self, attribute, getattr(self, attribute) + value )
else:
raise AttributeError("Can't upgrade non-existent attribute '{}'.".format(attribute))
请注意,我还使用__dict__
属性来简化实例设置:
class Ship:
# types is a class variable, and will be the same for all instances,
# and can be referred to by using the class. ie `Ship.types`
types = {
"schooner": {'weight':50, 'speed':30, 'poopdeck':18},
"galleon": {'weight':30, 'speed':14, 'poopdeck':14},
"default": {'weight':11, 'speed':11, 'poopdeck':11}
}
def __init__(self, name):
self.name = name
# we update the instance dictionary with values from the class description of ships
# this means that instance.speed will now be set, for example.
if name in Ship.types:
self.__dict__.update(Ship.types[name])
else:
self.__dict__.update(Ship.types["default"])
def upgrade(self, attribute, value):
if hasattr(self, attribute):
setattr(self, attribute, getattr(self, attribute) + value )
else:
raise AttributeError("Can't upgrade non-existent attribute '{}'.".format(attribute))
ship = Ship("schooner")
print(ship.speed) #=> 30
ship.upgrade("speed", 10)
print(ship.speed) #=> 40