2010-12-20 57 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