2015-09-11 259 views
1

雖然經歷Scapy的源代碼(https://github.com/jwiegley/scapy),I跨越事實均未以太IPTCPUDP或任何其它協議類別包含任何__init__方法來,他們也沒有任何具有類標註的方法。所有這些類繼承Packet類,它們包含__init__方法。類初始化

代碼結構是這樣的:

class Ether(Packet): 
    # class methods 

class IP(Packet, IPTools): 
    # class methods 

# Other protocol classes 

所以,我想知道如何當我們創建一個這樣的包這個類的實例被創建:

packet = Ether()/IP()/TCP() 

我能理解「/ 「符號。 Packet類已經覆蓋__rdiv __()方法,並且由於所有這些類都是Packet的子類,因此調用其父包實例的__rdiv __()。

但是,如何創建這些類的實例仍然不清楚。

此外,IP類可以這樣

ip = IP(src="10.0.0.1") 

如創建,IP沒有任何__init__方法,這個初始化是如何可能的?

僅供參考,__init__ 類看起來是這樣的:

def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields): 
    # initialization code 

任何幫助將不勝感激。

+0

您已經理解了繼承的原則,因爲如果子類沒有定義父類的'__rdiv __()'方法,就會調用它。你認爲'__init __()'有什麼不同? –

+0

感謝您的回覆。實際上,我知道parent的__init__必須從child的__init__中調用(如果有的話)。所以,我想也可能在這種情況下,父母的__init__必須被調用。 – Soumen

+0

@Soumen父母的'__init __()'只有在孩子擁有'__init __()'本身時,才需要從孩子的init明確調用。如果孩子沒有'__init __()',它會使用其父'__init __()'。當你在python中繼承一個類時,你繼承了它的所有屬性和函數,其中還包括像init這樣的函數。 –

回答

2

如果該類不包含自己的__init__()它只會採用超類中的一個。當添加更改時,只需要重寫__init__()。也許this將幫助你理解

0

我有一個存在的問題。在執行python教程之前,我沒有使用__init__來初始化對象。但在教程和我的大學裏,他們教導使用__init__作爲唯一的方法。所以這裏是他們教的內容:

class guitar(self): 
    def __init__(self, type, model): 
     self.type = type 
     self.model = type 

爲什麼它被教導爲一個神祕的函數,你必須用它來初始化類對象?

這是一個類似的方式,但不使用__init__

class guitar(identity): 
    def caracteristics(identity, type, model): 
     identity.type = type 
     identity.model = model 

caracteristics取代__init__ 和id替換自我

但更自然,你可以這樣做:

class guitar(id, type="", model=""): 
    id.type = type 
    id.model = model 

theres沒有必要使用__init__,它只是一個標準化?