动态类变量名的pythonic方法(ala PHP的$$ var)

时间:2009-10-26 19:28:45

标签: python

以下代码:

class Log:

    BAT_STATS = ['AB', 'R', 'H', 'HR']

    def __init__(self, type):
        for cat in Log.BAT_STATS:
               self.cat = 0

我希望循环在那里创建BAT_STATS中每个键的类属性,所以我可以去:

log = Log()
print log.HR;

类似于PHP,$ this-> $$ foo ='bar',其中$ foo为'HR'。

2 个答案:

答案 0 :(得分:8)

也许这个?

class Log:
    BAT_STATS = ['AB', 'R', 'H', 'HR']

    def __init__(self, type):
        for cat in Log.BAT_STATS:
            setattr(self, cat, 0)

编辑 - 哎呀,缩进有点混乱。

@EOL:您是否建议将其直接纳入课程定义?虽然对于某些应用程序而言,仅为类而不是按实例设置这些值可能是好的,但我不确定你是如何做到这一点的。在类定义中,您没有“self”或“klass”变量来调用setattr。在类定义的最后,Python将locals字典分组以用作类的成员字典。您可以使用locals()直接阅读此词典,但我认为您无法保证可以回复此词典。我猜想获得效果的最简单方法是在创建类字典之后修改类字典,但这可能会让人感到困惑,因为通过查看它的定义,类的行为不再清晰。这不是必然一个坏主意,但我不想在没有更好地理解它将要使用的场景的情况下推荐它。

答案 1 :(得分:0)

明确推荐:请勿使用以下内容 请放松下来...

编辑:我甚至发现Alex Martelli的一句话,表达我的片段有多糟糕。
(摘自 Python in a Nutshell ,第2版.O'Reilly 2006) 只有在真正不可或缺时才使用exec。通常情况下,最好避免exec选择更具体,控制良好的机制:exec pries松开你对代码命名空间的控制,损害性能并让你暴露于数字,难以发现的错误。

因此,这是我的不那么pythonic的时刻

class Log:
   BAT_STATS = ['AB', 'R', 'H', 'HR']
   def __init__(self):
      for cat in Log.BAT_STATS:
           exec('self.' + cat + ' = 0')

使用setattr()当然更干净(我在这个简单的例子中推荐它),但很高兴记住exec的力量......有点像被提醒我们在棚子里有一个危险的工具。