2010-12-20 55 views
1

我对类继承不是很有经验。请帮我看看下面的代码: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') 

它的工作原理。为什么有差异?非常感谢!!

干杯, 哲

回答

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指类)。

+0

感谢您的建议!其实我先试过这种方式,但后来得到了一个不同的错误: TypeError:super()参数1必须是type,而不是classobj – 2011-01-03 09:20:04

+0

@Zhe:你的基类是“旧式”;它不是从'object'派生的。在新的类型层次结构中,所有类都应该这样做。一旦你改变它,一切都应该工作。 – katrielalex 2011-01-03 23:45:54