如何将类构造函数传递给python函数

bea*_*ver 5 python constructor class function

假设我有一个类Foo,我想定义一个将类构造函数作为参数接收的函数:

def bar(class_name):
    local_class = None
    # TODO: if I call bar(Foo()), I want to get local_class = Foo()
Run Code Online (Sandbox Code Playgroud)

如何实现该功能?

Bri*_*anO 5

以下bar功能将起作用。请注意,第一个参数将是本身,而不是的名称,因此“ class_name”(暗示它是a str)具有误导性。args将是用于初始化klass对象的args元组,在对的调用中* -unpacked klass。您在稍后的评论中说,您希望“创建多个独立的对象”,所有这些都属于同一类,并使用相同的args进行初始化,因此我修改了答案以反映这一点:

def bar(klass, *args):
    # Now you can create multiple independent objects of type klass,
    # all initialized with the same args
    obj1 = klass(*args)
    obj2 = klass(*args)
    # ...
    # do whatever you have in mind with the objs
Run Code Online (Sandbox Code Playgroud)

您的“ local_class”根本不是一个类,而是的一个实例klass,所以这是一个不好的名字;而且无论如何您都想要其中的几个。

假设Foo对象使用三个int参数初始化,而Baz对象使用两个字符串初始化,则可以这样调用bar

bar(Foo, 1, 2, 3)
bar(Baz, 'Yo', 'bro')
Run Code Online (Sandbox Code Playgroud)

等等

尤其是在像Python这样的动态类型的语言中,当变量具有误导性的名称时,就很难进行代码推理。


小智 1

When 可以将类名作为参数传递给您的函数,然后调用class_name(). 例如,如果您还想传递参数。

class Foo:
    def __init__(self, arg1, arg2):
        pass

def bar1(class_name):
    args = ("val1", "val2")
    local_class = class_name(*args)
Run Code Online (Sandbox Code Playgroud)

或者

def bar2(class_name):
    kwargs = {'arg1':'val1','arg2':'val2'}
    local_class = class_name(**kwargs)
Run Code Online (Sandbox Code Playgroud)

您可以调用如下函数:

one = bar1(Foo)
two = bar2(Foo)
Run Code Online (Sandbox Code Playgroud)

如果您确实想从字符串调用该类,请阅读这篇文章。我建议您使用 @Evan Fosmark 的解决方案,因为应避免使用evalglobals