通常,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
实例?
答案 0 :(得分:4)
您的行f = type(...)
会返回一个类,而不是实例。
如果你f().base_method()
,它应该有效。
答案 1 :(得分: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