链式Python类调用

链式Python类调用,python,Python,我正在尝试构建一组类来定义OSI堆栈中协议的层次属性。。。在抽象意义上,我只需要从父python类继承属性,但我需要能够一次调用整个类链。。。所以,我在找这样的东西 #!/usr/bin/env python class Foo(object): def __init__(self,fooprop1=None): return None class Bar(Foo): def __init__(self,barprop1=None): retur

我正在尝试构建一组类来定义OSI堆栈中协议的层次属性。。。在抽象意义上,我只需要从父python类继承属性,但我需要能够一次调用整个类链。。。所以,我在找这样的东西

#!/usr/bin/env python

class Foo(object):
    def __init__(self,fooprop1=None):
        return None
class Bar(Foo):
    def __init__(self,barprop1=None):
        return None

if __name__=='__main__':
    tryit = Foo(fooprop1="someMacAddress").Bar(barprop1="someIpAddress")
但是,调用该脚本会抱怨
AttributeError:“Foo”对象没有属性“Bar”


有人能告诉我一种用python完成这项工作的方法吗?提前感谢…

正如S.洛特所提到的,你应该做如下事情:

class Foo(object):
    def __init__(self,fooprop1=None):
        return None

class Bar(object):
    def __init__(self,barprop1=None, afoo):
        self.foo = afoo
        return None

if __name__=='__main__':
    thefoo = Foo(fooprop1="someMacAddress")
    thebar = Bar(barprop1="someIpAddress", thefoo)

看看它是如何在:

$sudo scapy
欢迎来到Scapy(2.1.0)
>>>sr(IP(dst=“8.8.8.8”)/UDP()/DNS(rd=1,qd=DNSQR(qname=“stackoverflow.com”))
开始排放:
完成发送1个数据包。
.............*
收到44个数据包,得到1个答案,剩余0个数据包
(, )
>>>ans=u0[0]
>>>答复摘要()
IP/UDP/DNS Qry“stackoverflow.com”==>IP/UDP/DNS Ans“64.34.119.12”

scapy
使用
/
运算符从不同层组成数据包。

将OSI堆栈建模为类层次结构可能不是最好的方法。这些层彼此完全独立。试图通过结合继承和委派来实现这一点可能是个坏主意。您可能想重新开始使用委托。此外,您的示例是一个“流畅”的界面,最好通过委派来完成。我同意S.洛特的观点!您的OSI层应该是“适配器”,正如人们所称的设计模式,它们相互缠绕,并且依赖于彼此的接口。您可以将它们与:
Bar(“someIPAddress”,Foo(“someMacAddress”)
组合,或者,如果您需要独立访问它,当然可以先将
Foo
保存在变量中。虽然OSI层看起来是完全独立的,但实际上它们不是。。。例如。。。TCP PDU本身没有任何意义。。。它总是封装在IP PDU中,而IP PDU则封装在以太网(或PPP/HDLC)帧中。最后,我希望能够实例化一个IP堆栈,然后在上面添加TCP或UDP套接字信息。。。i、 e.host01=Eth(macsrc=“000a.dead.beef”).IP(src=“1.1.1.1”,dst=“100.10.10.5”)socket01=host01.TCP(srcport=“1026”,dstport=“80”)socket02=host01.TCP(srcport.incr(),dstport=“443”)委托能做到这一点吗?谢谢,我最后使用了一个基于利用了将负责的类链接起来。可以在中找到该功能的简单实现。从本质上讲,scapy对uuu div_uuuu()也在做同样的事情
$ sudo scapy
Welcome to Scapy (2.1.0) 
>>> sr(IP(dst="8.8.8.8") / UDP() / DNS(rd=1,qd=DNSQR(qname="stackoverflow.com")))
Begin emission:
..............................Finished to send 1 packets.
.............*
Received 44 packets, got 1 answers, remaining 0 packets
(<Results: TCP:0 UDP:1 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>> ans = _[0]
>>> ans.summary()
IP / UDP / DNS Qry "stackoverflow.com"  ==> IP / UDP / DNS Ans "64.34.119.12"