【问题标题】:Python: How to create a class object using Importlib [duplicate]Python:如何使用 Importlib 创建类对象 [重复]
【发布时间】:2018-03-22 16:44:24
【问题描述】:

我知道类似的问题已被多次询问/回答。但请继续阅读..

我正在尝试从 Python 3.6 中的“Convert string to Python Class Object”中描述的字符串值创建一个类。

utils.py

class Foo(object):
    def __init__(self):
        print("In the constructor of Foo")

    def What(self):
        print("so what ... ")

class FooParam(object):
    def __init__(self, v):
        self.value = v
        print("In the constructor of FooParam")

    def What(self):
        print("Value=" % self.value)
        print("So what now ...")

welcome.py

def TEST1():
    m = importlib.import_module("utils")
    c = getattr(m, "Foo")
    c.What()  

if __name__ == '__main__': 
    TEST1()

错误

TypeError: What() missing 1 required positional argument: 'self'

那么我做错了什么?

另外,如何创建“FooParam”对象并将值传递给构造函数。

【问题讨论】:

  • “我怎样才能创建一个“FooParam”的对象并将一个值传递给构造函数。” -> 你用一个参数调用它的构造函数。 FooParam = getattr(m, "FooParam"); obj = FooParam(whatever).

标签: python python-importlib


【解决方案1】:

我怀疑 c 是类 Foo 但不是该类的实例。

这相当于简单地调用

Foo.what()

这就是为什么 self 没有定义!

而你想要的是创建一个类的实例(给它一个'self'属性),然后调用它的方法,即

foo_instance = Foo()
foo_instance.What()

所以尝试将 c.What() 替换为..

foo_instance = c()
foo_instance.What()

对于 FooParam:

#import the class FooParam
c = getattr(m, "FooParam")
#create an instance of the class, initializing its values (and self)
fooparam_instance = c(3.14)
#call its method!
fooparam_instance.What()

总的来说,我会将变量 c 重命名为 foo_import 和 fooparam_import 之类的东西:)

【讨论】:

    【解决方案2】:

    导入模块后,只需使用存储的变量访问导入模块:

    m = importlib.import_module("utils")
    foo = m.Foo()
    foo.What()
    

    import_module 执行与import 相同的步骤。

    这行代码c = getattr(m, "Foo") 等效于f = Foo,因此这意味着您不是在创建实例,而是获得对该类的引用。

    【讨论】:

    • 谢谢两位的回答。错过了importlib的一个重要点是很尴尬的。现在可以使用了。
    猜你喜欢
    • 2011-10-22
    • 2014-04-28
    • 2015-04-02
    • 2019-01-02
    • 2017-09-26
    • 2012-03-13
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多