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)
如何实现该功能?
以下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 的解决方案,因为应避免使用eval和globals