雖然經歷Scapy的源代碼(https://github.com/jwiegley/scapy),I跨越事實均未以太,IP,TCP,UDP或任何其它協議類別包含任何__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
任何幫助將不勝感激。
您已經理解了繼承的原則,因爲如果子類沒有定義父類的'__rdiv __()'方法,就會調用它。你認爲'__init __()'有什麼不同? –
感謝您的回覆。實際上,我知道parent的__init__必須從child的__init__中調用(如果有的話)。所以,我想也可能在這種情況下,父母的__init__必須被調用。 – Soumen
@Soumen父母的'__init __()'只有在孩子擁有'__init __()'本身時,才需要從孩子的init明確調用。如果孩子沒有'__init __()',它會使用其父'__init __()'。當你在python中繼承一個類時,你繼承了它的所有屬性和函數,其中還包括像init這樣的函數。 –