我正在使用 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)
但是,我仍然很想知道如何回答我的原始问题,因为在没有排除声明的情况下运行类似于我的原始问题的问题仍然有用。
请您参考如下方法:
您可以使用**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。
