0

通常,可以从派生类调用 Python 中的基类方法,就像调用任何派生类函数一样:

class Base:
    def base_method(self):
        print("Base method")

class Foo(Base):
    def __init__(self):
        pass

f = Foo()
f.base_method()

但是,当我使用该函数动态创建一个类时type,我无法在不传入self实例的情况下调用基类方法:

class Base:
    def base_method(self):
        print("Base method")

f = type("Foo", (Base, object), { "abc" : "def" })
f.base_method() # Fails

这会引发 TypeError:TypeError: base_method() takes exactly 1 argument (0 given)

如果我显式传递一个self参数,它会起作用:

f.base_method(f)

为什么self调用基类方法时需要显式传递实例?

4

2 回答 2

4

您的行f = type(...)返回一个类,而不是一个实例。

如果你这样做f().base_method(),它应该工作。

于 2012-09-12T19:09:35.357 回答
2

type返回一个类而不是一个实例。您应该在调用之前实例化该类base_method

>>> class Base(object):
...     def base_method(self): print 'a'
... 
>>> f = type('Foo', (Base,), {'arg': 'abc'})
>>> f.base_method()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method base_method() must be called with Foo instance as first argument (got nothing instead)
>>> f().base_method()
a
于 2012-09-12T19:10:02.347 回答