Python 类继承中缺少的方法?
我对类的继承不是很熟悉。请帮我看看下面的代码:
class Handle(STAFHandle):
def __init__(self, HandleName):
handle = STAFHandle.__init__(self, HandleName)
self.initLogger(handle)
def initLogger(self, handle):
self.logger = Logging(handle, 'Test')
handle = Handle('test')
handle.logger.info('test')
它说提交方法没有定义:
result = handle.submit(system, service, logRequest) AttributeError: 'NoneType' object has no attribute 'submit'
但是如果我把它改成:
class Handle(STAFHandle):
def __init__(self, HandleName):
handle = STAFHandle.__init__(self, HandleName)
def initLogger(self, handle):
self.logger = Logging(handle, 'Test')
handle = Handle('test')
handle.initLogger(handle)
handle.logger.info('test')
它就能正常工作了。为什么会有这样的区别呢?非常感谢!!
祝好,
Zhe
1 个回答
4
STAFHandle.__init__
返回的是 None
。你可能想要的是:
class Handle(STAFHandle):
def __init__(self, handle_name):
super(Handle, self).__init__(handle_name)
self.initLogger()
def initLogger(self):
self.logger = Logging(self, 'Test')
handle = Handle('test')
记住,__init__
方法的第一个参数是一个对象,它会对这个对象进行“修改”。所以当你调用 super(Handle, self).__init__(handleName)
的时候,你实际上是在改变 self
的属性,而不是返回一个新的对象。你给出的两个例子之间的区别在于,两个 initLogger
调用中的变量 handle
指向的是不同的东西。
注意,我把明确的 STAFHandle.__init__
调用换成了 super
代理;在这种情况下,它们是等价的,但这样做更灵活,因为你可以在不破坏 __init__
的情况下改变类的继承关系。
我还把 HandleName
改成了 handle_name
,这样符合 Python 的命名规范(CamelCase 通常用于类名)。