在for循环中创建变量

时间:2015-05-27 02:53:18

标签: python

我正在使用python创建一个龙与地下城角色创建者,目前正在编写武器。我重新创建了一些在以前的类似环境中无法工作的代码,我想知道它的工作方式,而不需要为每个单独的变量使用if语句,因此可以使用其他属性和项目的编辑。

目标是创建一个仅具有与之关联的属性(变量)的武器(对象)。

当前代码:

class Weapon:
    def __init__(self, finesse, light, thrown, two_handed, versatile):
        property_list = [finesse, light, thrown, two_handed, versatile]
        for prop in property_list:
            if prop != 0:
                self.prop = prop

dagger = Weapon('finesse', 'light', 'thrown', 0, 0)

目前不会为武器创建变量;从而

dagger.finesse

不存在。理想情况下,'finesse'将存储在变量dagger.finesse中,而代码不会创建变量dagger.two_handed

我可能忽略了一些简单的问题,可能会有重复的问题,但我找不到与我正在寻找的答案类似的问题。

感谢所有回复的人

编辑

感谢@WKPlus提供的格式化帮助;我是stackoverflow网站的新手

我已经意识到了@abarnert,更好的方法是将变量列在变量中并在稍后的属性代码中检查该变量,如此

class Weapon:
    def __init__(self, finesse, light, thrown, two_handed, versatile):
        property_list = [finesse, light, thrown, two_handed, versatile]
        self.properties = []
        for prop in property_list:
            if prop != 0:
                self.properties.append(prop)

但是,我仍然有兴趣了解我的原始问题是如何得到解答的,因为在没有排除声明的情况下运行类似我原创的内容仍然有用。

3 个答案:

答案 0 :(得分:4)

您可以使用**kwargssetattr

class Weapon:
    def __init__(self, **kwargs):
        property_list = ['finesse', 'light', 'thrown', 'two_handed', 'versatile']
        for prop in property_list:
            setattr(self, prop, kwargs.get(prop, False))

dagger = Weapon(finesse=True, light=True, thrown=True)

这将在传递的参数中查找property_list中的任何属性,并在self上设置该属性。如果找不到该属性,则会将其设置为False

答案 1 :(得分:3)

这样可行:

class Weapon:
    def __init__(self, finesse=False, light=False, thrown=False, two_handed=False,
                 versatile=False):
        props = locals()
        props.pop('self')
        for prop, value in props.items():
            if value:
                setattr(self, prop, value)

现在:

dagger = Weapon('finesse', 'light', 'thrown', 0, 0)

或:

dagger = Weapon('finesse', 'light', 'thrown')
  1. 我使用我设置为False的默认参数。所以,如果你不提供它们 它们是False

  2. locals()为您提供了到目前为止定义的所有局部变量的字典。 这里是__init__()的论据。 由于您不想self.self,请使用props.pop('self')将其删除。

  3. self.prop = prop does无效。

    例如,如果您是课程A和变量x

    class A(object):
        pass
    x = 1
    

    此:

    for obj in [x]:
        A.obj = obj
    

    提供属性obj

    >>> A.obj
    1
    

    这里:

    setattr(A, 'x', x)
    

    为您提供了一个属性x

    >>> A.x
    1
    

    您需要setattr(self, name, value)以编程方式设置属性。

答案 2 :(得分:0)

除了使用setattr设置属性外,您还可以将您的args解析为dict并使用它更新__dict__属性:

class Weapon:
    def __init__(self, finesse, light, thrown, two_handed, versatile):
        property_list = ['finesse', 'light', 'thrown', 'two_handed', 'versatile']
        property_values = dict([(name,eval(name)) for name in property_list])
        self.__dict__.update(property_values)

dagger = Weapon('finesse', 'light', 'thrown', 0, 0)
print dagger.finesse
相关问题