【问题标题】:How to pass a class constructor to a python function如何将类构造函数传递给python函数
【发布时间】:2015-12-18 23:14:00
【问题描述】:

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

def bar(class_name):
    local_class = None
    # TODO: if I call bar(Foo()), I want to get local_class = Foo()

如何实现该功能?

【问题讨论】:

  • 当你调用 bar(Foo()) 时,你会使用 Foo() 的实例调用 bar() 函数,你不能直接使用那个实例吗?
  • Foo() 不是类构造函数。如果你想通过课程,你可以通过Foo
  • 刚刚通过类,bar(Foo),然后local_class = class_name() 将创建 Foo 的实例。
  • @AnandSKumar 函数内部,我想通过参数class_name获取类的多个独立实例
  • @achampion 如果Foo 带参数怎么办?例如,bar(Foo(1,2,3))

标签: python function class constructor


【解决方案1】:

什么时候可以将类名作为参数传递给你的函数,然后调用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 post 的字符串中调用类。我建议你使用@Evan Fosmark 的解决方案,因为应该避免使用evalglobals

【讨论】:

    【解决方案2】:

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

    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
    

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

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

    bar(Foo, 1, 2, 3)
    bar(Baz, 'Yo', 'bro')
    

    等等

    尤其是在像 Python 这样的动态类型语言中,当变量具有误导性名称时,对代码的推理会更加困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 2021-08-27
      • 2023-04-04
      相关资源
      最近更新 更多