【问题标题】:python how to create classes in the same file dynamically with namepython如何使用名称在同一文件中动态创建类
【发布时间】:2014-01-10 04:26:39
【问题描述】:

假设我们有一个 python 文件:

class A(object):
    def say_hi(self):
        print('hi, I am A')


class B(object):
    def say_hi(self):
        print('hi, I am B')


class F(object):
    def __init__(self, name):
        self.name = name

    def create(self):
        return  ## ???


if __name__ == '__main__':
    f = F('B')
    b = f.create()
    b.say_hi()

我想用它的名字创建一个类的实例。 F.create() 中的代码应该是什么?

【问题讨论】:

  • globals()[self.name]() ?
  • @thefourtheye 好吧,如果我通过“A”,我想要一个 A() 如果是“B”,那么 B()
  • @DSM '因为我需要根据给出类名的配置文件创建实例。
  • @mitnk:啊,对不起。我误读了这个问题。我以为您正在创建实例并将它们绑定到给定名称,但实际上您是在 访问 对象。这是完全明智的。

标签: python factory


【解决方案1】:

使用globals:

>>> class A(object):
...     def say_hi(self):
...         print('hi, I am A')
...
>>> class B(object):
...     def say_hi(self):
...         print('hi, I am B')
...
>>> class F(object):
...     def __init__(self, name):
...         self.name = name
...     def create(self):
...         return globals()[self.name]()
...
>>>
>>> f = F('B')
>>> b = f.create()
>>> b.say_hi()
hi, I am B

【讨论】:

  • 谢谢。我一直认为在 python 中使用globalslocals 有点邪恶。所以它一点也不邪恶(至少在这里的代码中)?
  • @mitnk,如果您想将名称限制为AB,请使用{'A': A, 'B': B}[self.name]() 之类的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2022-11-12
相关资源
最近更新 更多