1. 程式人生 > >Python面向對象——繼承

Python面向對象——繼承

python類繼承

#coding:utf-8 """ 術語: 1、在python3中,自定義創建的類都默認繼承了python類中名為object的類 2、object類提供的方法,是雙下劃線開頭的,是為了提供給python內部使用 3、被繼承的類叫做超類,或者叫做父類 4、從超類(父類)繼承過來的類叫做子類 5、子類來源於父類,又或者說,子類擴展了父類的功能 """ """ #擴展類:給一個已經存在的類添加新的行為(方法) class Util: #我定義的這個類(意圖是工具類),沒有明確繼承誰,所以它默認繼承object類 #定義掃描ip範圍的方法 def scan_ip_range(self, ip_range): print("start scan ip range: ", ip_range) class ChildUtil(Util): #這個類繼承了Util類 #添加一個掃描端口的功能 def scan_port(self, port): print("start scan port: ", port) if __name__ == '__main__': s = ChildUtil() #實例化子類後,創建出了對象s s.scan_ip_range("10.36.1.0/24") #掃描IP範圍的方法是從父類繼承過來的 s.scan_port(80) #掃描端口的方法是在子類中擴展的 """ """ #重寫普通方法 # 1、重寫就是,比如父類裏有a方法,但是對a方法不滿意,需要重寫 # 2、解決辦法就是,在子類中寫一個和父類中a方法名字一樣的方法,名字也叫a # 3、因此,這樣就等價於重寫了 class Supper(): def a(self): print("hello a") class Child(Supper): def a(self): print("Hi! a...") if __name__ == '__main__': o = Child() o.a() #此刻的調用是子類中的a方法 #如果把子類中的a方法去掉,那麽調用則是父類中的a方法 # 測試結論: # 1、子類中的a方法只是覆蓋了父類中的a方法,所以父類中的a方法還是存在的 # 2、如果子類沒有a方法,則會到父類中去找,父類沒有的話會到object類中找,還是沒有則引發異常 # 3、因此,可以看出這個查找順序是就近原則 """ #重寫__init__(),普通方法可以重寫,初始化也是可以從寫的 """ 例如: 有一個類用來描述物理機對象,並且對象有主機名、IP地址、操作系統這3個基本屬性 還有一個類用來描述vmware的虛擬機對象,也有和物理機一樣的3個屬性,但是虛擬機還有一個vmtools屬性 那麽,在定義虛擬機類的時候,難道要再重新定義一遍主機名、IP地址、操作系統這三個屬性? 那麽虛擬機類既然還有一個vmtools屬性,那麽肯定就有初始化方法,但是描述物理機對象的類也有初始化方法 這特麽就引發問題了,解決代碼如下 """ """ class Host: def __init__(self, hostname, ip, os): self.hostname = hostname self.ip = ip self.os = os def get_info(self): print(self.hostname, self.ip, self.os) class Vm(Host): def __init__(self, hostname, ip, os, vmtools): super().__init__(hostname, ip, os) #super的功能就是調用父類的代碼 self.vmtools = vmtools #重寫了父類的get_info方法 def get_info(self): super().get_info() #super的功能就是調用父類的代碼 print(self.vmtools, ) if __name__ == '__main__': v = Vm("vm1","10.2.3.4","centos6.5", "vmtools_v1") v.get_info() """ #多重繼承 """ 就是有父類A,父類B,一個子類C,但是類C什麽都沒有 類C同時繼承了父類A和B,這時候,C就擁有了父類A和B的屬性和方法,都被繼承過來了 """ class A: def get_a(self): print("my a...") class B: def get_b(self): print("my b...") class C(A, B): #繼承A和B pass if __name__ == '__main__': c = C() c.get_a() c.get_b() #應用場景一目了然,不用多說什麽 #在查找順序,首先是在C類找,那麽,然後是在A找還是在B找?這涉及到一個查找方式的問題 #多重繼承,有兩種搜索方式,分別是深度優先和廣度優先,具體的自行google


Python面向對象——繼承