2012-07-17 11 views
26

Telnet üzerinden bir laboratuar cihazına bağlanmaya çalışıyorum.Python - eski stil sınıflarından miras alma

import telnetlib 
class Instrument(telnetlib.Telnet): 
    def __init__(self, host=None, port=0, timeout=5): 
     super(Instrument,self).__init__(host, port, timeout) 

Bu kodda yapmaya çalışıyorum Tüm ebeveynden __init__ yöntemini devralır: Bizim araca özgü fonksiyonları içerecek şekilde, standart kütüphanesinde telnetlib modülünden Telnet sınıfını genişletmek istiyorum sınıf (telnetlib.Telnet) ve standart argümanları iletir, böylece daha sonra __init__'a şeyler ekleyebilirim. Bu formül benim için başka vesilelerle çalıştı; ondan devralan vermez (

TypeError: must be type, not classobj 

Ben telnetlib için kaynak koduna baktım ve Telnet eski tarz bir sınıfını gibi görünen: o super() deyimi de bana bir hata verir bu sefer örneğini çalıştığınızda object) - Bu benim sorunumun kaynağı olabilir mi merak ediyorum? Eğer öyleyse, nasıl aşılabilir? Türetilmiş sınıfın hem üst sınıftan hem de object'dan miras aldığı bazı kod örneklerini gördüm, ancak bunun benimle aynı soruna bir yanıt olup olmadığından emin değilim.

Tam açıklama: Ben de super() yerine Telnet ile from telnetlib import Telnetsuper() yerine telnetlib.Telnet kullanarak çalıştı ve var. Bu durumlarda sorun devam etmektedir.

Teşekkürler!

cevap

36

Böyle constructor çağırmak gerekir:

telnetlib.Telnet.__init__(self, host, port, timeout) 

Sen telnet.Telnet.__init__ beri açık self atanan bir örneği witout bağımlı yöntem ziyade bir ilişkisiz yöntem, yani değil eklemeniz gerekir. Yani onu çağırırken örneği açıkça geçirmeniz gerekiyor.

>>> Test.__init__ 
<unbound method Test.__init__> 
>>> Test().__init__ 
<bound method Test.__init__ of <__main__.Test instance at 0x7fb54c984e18>> 
>>> Test.__init__() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method __init__() must be called with Test instance as first argument (got nothing instead) 
+0

Bunu denedim - bana hata veriyor: 'TypeError: ilişkisiz yöntem __init __() ilk argüman olarak Telnet örneğiyle çağrılmalı (bunun yerine str örneği var)' –

+0

Lütfen tam kodu ve hatayı alın az önce gönderdiğim kod. Çünkü aslında eski tarz bir sınıfın ana kurucusunu aramak isterseniz bu nasıl yapılır? – ThiefMaster

+0

Ah, senin kodun ve benimki arasındaki farkı fark ettim - sen 'selfin' '__init__' ilk argümanı vardı. Şimdi çalışıyor - çok hızlı cevapladığınız için teşekkürler! Kurucunun ilk argümanı olarak niçin 'kendini' vermeniz gerektiğini açıklayabiliyor musunuz? Python’da yeniyim. –

13

Sen object devralmak zorunda ve size miras çalıştığınız eski tarz dersten sonra koymak gerekir dan (böylece object 'ın yöntemleri ilk bulunmayan bu):

>>> class Instrument(telnetlib.Telnet,object): 
...  def __init__(self, host=None, port=0, timeout=5): 
...   super(Instrument,self).__init__(host, port, timeout) 
... 
>>> Instrument() 
<__main__.Instrument object at 0x0000000001FECA90> 

Nesneden miras alma, size super ile çalışan yeni bir stil sınıfı verir.

+2

Eski stil bir sınıftan, ona dayalı yeni bir stil sınıfı oluşturacak şekilde miras kalması güvenli midir? – ThiefMaster

+0

@ThiefMaster Herhangi bir sorundan haberdar değilim, ama bunu asla öfkeyle yapmadım, bu yüzden hiçbir bilgiye sahip değilim. Herhangi bir problem bekliyor musunuz? – Marcin

+0

Python'da multi-miras konusuna aşina değilim. Yeni tarz bir sınıf benim amacım için herhangi bir avantaj sağlamadığından, TheifMaster'ın yukarıdaki stratejisine bağlı kalacağım. Yine de teşekkürler! –

İlgili konular