2011-03-19 49 views
1

我想構建一組類以定義OSI堆棧中的協議的分層屬性...在抽象意義上,我只需要繼承父類python類的屬性,但我需要能夠調用全班鏈一次......所以,我正在尋找這樣的事情...鏈式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' object has no attribute 'Bar'

能有人告訴我一個方法在python中完成這項工作?在此先感謝...

+5

將OSI堆棧建模爲類層次結構可能不是最好的想法。這些圖層完全相互獨立。試圖通過結合繼承和委託來做到這一點可能是一個壞主意。您可能需要再次使用委派來重新開始。此外,您的示例是一個「流暢」的界面,最好用委派完成。 – 2011-03-19 13:08:56

+0

我同意S.Lott!您的OSI圖層應該是「適配器」,就像人們稱之爲「設計圖案」的設計圖案一樣,它們彼此纏繞在一起,並且依賴於彼此的接口。如果你需要獨立訪問它,你可以將它們結合起來:'Bar(「someIPAddress」,Foo(「someMacAddress」)),或者當然可以首先將'foo'保存在一個變量中。 – 2011-03-19 13:13:48

+0

儘管看起來OSI層是完全獨立的,但實際上它們並不是......例如...... TCP PDU本身就意味着什麼......它總是被包裹在一個IP PDU中,該PDU被包裹在以太網(或PPP/HDLC)幀。最終,我希望能夠實例化一個IP堆棧,然後在它們上面添加TCP或UDP套接字信息......即

 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") 
可以委託做這個嗎? – 2011-03-19 14:21:54

回答

1

看看它是如何在做scapy

$ 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" 

scapy使用/運營商從不同的層組成一個數據包。

+0

謝謝,我使用Python責任鏈模式,基於利用__add __()鏈接負責任的類的代碼。一個簡單的實現可以在[Active State Recipe 302422](http://code.activestate.com/recipes/302422-handler-stack/)中找到。基本上scapy用__div __()做同樣的事情 – 2011-03-27 09:02:40

1

由於美國洛特提到,你應該做的是這樣的:

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)