我正在使用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)
但是,我仍然有兴趣了解我的原始问题是如何得到解答的,因为在没有排除声明的情况下运行类似我原创的内容仍然有用。
答案 0 :(得分:4)
您可以使用**kwargs
和setattr
:
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')
我使用我设置为False
的默认参数。所以,如果你不提供它们
它们是False
。
locals()
为您提供了到目前为止定义的所有局部变量的字典。
这里是__init__()
的论据。
由于您不想self.self
,请使用props.pop('self')
将其删除。
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