Python—将类作为参数调用
我对Python很陌生,但谷歌搜索并没有找到与之匹配的答案 我创建了一个模块,包含10个GUI按钮类。要使用按钮,我用代码Python—将类作为参数调用,python,Python,我对Python很陌生,但谷歌搜索并没有找到与之匹配的答案 我创建了一个模块,包含10个GUI按钮类。要使用按钮,我用代码ButtonLib.TypeA(**kwargs),ButtonLib.TypeB(**kwargs)等等编写。 kwargs适用于所有按钮 按钮(数量和类型)由用户选择(存储在按钮类型向量中),并且事先不知道 我想知道是否有一种更有效地编写代码的方法,而不是: for x in button_type_vector: if x == 'TypeA':
ButtonLib.TypeA(**kwargs)
,ButtonLib.TypeB(**kwargs)
等等编写。
kwargs
适用于所有按钮
按钮(数量和类型)由用户选择(存储在按钮类型向量中),并且事先不知道
我想知道是否有一种更有效地编写代码的方法,而不是:
for x in button_type_vector:
if x == 'TypeA':
ButtonLib.TypeA(**kwargs)
elif x== 'TypeB' :
ButtonLib.TypeB(**kwargs)
等等
我的意思是:
for x in button_type_vector:
ButtonLib.x(**kwargs)
thnks您可以使用内置函数使用字符串访问对象的属性:
返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,'foobar')
相当于x.foobar
。如果命名属性不存在,则返回默认值(如果提供),否则引发
正如@MadPyhisist所提到的,模块不是某种魔法对象,因此可以像任何普通对象一样使用,可以是getattr
您可以使用内置函数使用字符串访问对象的属性:
返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,'foobar')
相当于x.foobar
。如果命名属性不存在,则返回默认值(如果提供),否则引发
正如@MadPyhisist所提到的,模块不是某种神奇的对象,因此可以像任何普通对象一样使用,可以是getattr
您可以定义一个字典(最好在模块内部):
然后调用条目:
ButtonLib.buttons[x](**kwargs)
如果您的按钮类有一个返回其名称的函数,您也可以这样定义字典:
buttons = {
button_type.name: button_type
for button_type in [TypeA, TypeB, …]
}
更高级:Python将类的名称存储在中。
更高级的是:您可以使用getattr(ButtonLib,name)
获取模块的元素。但这可能会影响可读性。您可以定义字典(最好在模块内部):
然后调用条目:
ButtonLib.buttons[x](**kwargs)
如果您的按钮类有一个返回其名称的函数,您也可以这样定义字典:
buttons = {
button_type.name: button_type
for button_type in [TypeA, TypeB, …]
}
更高级:Python将类的名称存储在中。
更高级的是:您可以使用getattr(ButtonLib,name)
获取模块的元素。但这可能会影响可读性。我不太理解您的代码。在range
上迭代会生成整数,但您将x
与字符串进行比较。你不应该直接在按钮类型向量上迭代吗?@ChristianDean-对不起。修复itIt不是Python,而是OOP字段。您应该使用abstract.TypeX方法定义BaseButton类,并将该类用作每个按钮类型的父类,将特定函数分配给构造函数中的.TypeX。然后你只要按一下按钮。TypeX(**kwargs)@ChristianDean。“你为什么要删除你的答案?”MadPhysicator呃,在我发布完我的答案后,我意识到这可能是一个非常常见的重复问题。所以我想我应该投票结束而不是回答。我不太明白你的代码。在range
上迭代会生成整数,但您将x
与字符串进行比较。你不应该直接在按钮类型向量上迭代吗?@ChristianDean-对不起。修复itIt不是Python,而是OOP字段。您应该使用abstract.TypeX方法定义BaseButton类,并将该类用作每个按钮类型的父类,将特定函数分配给构造函数中的.TypeX。然后你只要按一下按钮。TypeX(**kwargs)@ChristianDean。“你为什么要删除你的答案?”MadPhysicator呃,在我发布完我的答案后,我意识到这可能是一个非常常见的重复问题。所以我想我应该投票结束而不是回答。谢谢你的回答!!你们能详细解释一下“高级方式”吗?我的最终代码包括你们的答案和院长。非常感谢。谢谢你的回答!!你们能详细解释一下“高级方式”吗?我的最终代码包括你们的答案和院长。非常感谢。谢谢-缺少的是(**kwargs)
谢谢-缺少的是(**kwargs)