3

我知道类似的问题已经被问过/回答了好几次。但请继续阅读..

我正在尝试从Python 3.6中的“将字符串转换为 Python 类对象”中所述的字符串值创建一个类。

实用程序.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 ...")

欢迎.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”对象并将值传递给构造函数。

4

2 回答 2

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 之类的东西:)

于 2018-03-22T17:04:30.373 回答
0

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

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

import_module执行与 相同的步骤import

c = getattr(m, "Foo")行代码是等价的f = Foo,这意味着您没有创建实例,而是获得了对该类的引用。

于 2018-03-22T16:57:44.477 回答