Python面向對象——繼承
阿新 • • 發佈:2017-12-29
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面向對象——繼承