假设我有一个类Foo
,我想定义一个接收类构造函数作为参数的函数:
def bar(class_name):
local_class = None
# TODO: if I call bar(Foo()), I want to get local_class = Foo()
我该如何实现这个功能?
答案 0 :(得分:4)
以下class_name
功能将起作用。请注意,第一个参数将是类本身而不是类的名称,因此“str
”(暗示它是args
)具有误导性。 klass
将是一个args元组,用于在klass
的调用中使用* -unpacked初始化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
个对象。你在后来的评论中说过,你想要“创建多个独立的对象”,所有相同的类并使用相同的args初始化,所以我修改了我的答案以反映:
local_class
你的“klass
”根本不是一个类,而是一个Foo
的实例,所以这是一个坏名字;无论如何你想要其中几个。
假设使用三个int参数初始化Baz
个对象,并使用两个字符串初始化bar
个对象,可以这样调用bar(Foo, 1, 2, 3)
bar(Baz, 'Yo', 'bro')
:
<div><font face=""Times New Roman"" size=3 color=black>MyCustomer Name Ltd.</font></div>
<div><font face=""Times New Roman"" size=3 color=black>MyCustomer Adress</font></div>
<div><font face=""Times New Roman"" size=3 color=black>MyCustomer Zip-code MyCustomer City</font></div>
等
特别是在像Python这样的动态类型语言中,当变量具有误导性名称时,对代码的推理会更加困难。
答案 1 :(得分:0)
何时可以将类名作为参数传递给函数,然后调用class_name()
。例如,如果你也想传递参数。
class Foo:
def __init__(self, arg1, arg2):
pass
def bar1(class_name):
args = ("val1", "val2")
local_class = class_name(*args)
或
def bar2(class_name):
kwargs = {'arg1':'val1','arg2':'val2'}
local_class = class_name(**kwargs)
您可以调用以下函数:
one = bar1(Foo)
two = bar2(Foo)
如果你真的想从一个字符串中读取this帖子。我建议你使用@Evan Fosmark的解决方案,因为应该避免使用eval
和globals