我正在尝试创建一种方法,将一个前缀应用于一个可以修改项目现有统计数据的项目。例如,在下面的代码中,我试图将'huge'前缀应用于'jar'项。我想让代码可以重复使用,这样我就可以有不同的前缀('fast','healthy')来修改不同的项目统计数据。
class Prefix(object):
def __init__(self, word, stat, valu):
self.word = word
self.stat = stat
self.valu = valu
class Item(object):
def __init__(self, name, size):
self.name = name
self.size = size
def apply_prefix(self, prefix):
self.prefix.stat += prefix.valu # <-- Here is my issue
self.name = prefix.word + ' ' + self.name
# My hope is to make the code reusable for any stat
def print_stats(self):
print self.name, self.size
def main():
jar = Item('jar', 10)
huge_prefix = Prefix('huge', 'size', 5)
jar.apply_prefix(huge_prefix)
jar.print_stats()
答案 0 :(得分:1)
您正在尝试动态引用到某个属性。您可以使用getattr
执行此操作。如果你想设置属性,那么......那就是setattr
:)
def apply_prefix(self, prefix):
target_attr = getattr(self,prefix.stat) #dynamically gets attr
setattr(self,prefix.stat,target_attr+prefix.valu)
至于这是否是最好的编码风格:它取决于。在某些情况下,使用getattr
可以使代码更加清晰。既然你现在只有两个统计数据,那么需要这种动态属性引用似乎太过分了,因为我可以很容易地做到:
bogus_prefix = Prefix('huge','bogus',3)
哪个是有效Prefix
,但在我尝试应用时会抛出AttributeError
。这不是调试最直接的事情。
然而,getattr
方法有奖励:如果您添加更多统计信息,则无需更改Prefix
中的代码(哈哈)。
其他替代方案? Python中有始终选项。 : - )
我这样做的方法是让Prefix
只是dict
个单词:值对。然后apply_prefix
将遍历单词键,一次更新尽可能多的值。这是一种类似的动态方法,但可扩展性更强。