2015-09-11 213 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__,它只是一个标准化?