Python—将类作为参数调用

Python—将类作为参数调用,python,Python,我对Python很陌生,但谷歌搜索并没有找到与之匹配的答案 我创建了一个模块,包含10个GUI按钮类。要使用按钮,我用代码ButtonLib.TypeA(**kwargs),ButtonLib.TypeB(**kwargs)等等编写。 kwargs适用于所有按钮 按钮(数量和类型)由用户选择(存储在按钮类型向量中),并且事先不知道 我想知道是否有一种更有效地编写代码的方法,而不是: for x in button_type_vector: if x == 'TypeA':

我对Python很陌生,但谷歌搜索并没有找到与之匹配的答案

我创建了一个模块,包含10个GUI按钮类。要使用按钮,我用代码
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)