面向物件:理解 Python 類的單繼承與多繼承
俗話說"龍生龍鳳生鳳老鼠的孩子會打洞",每種動物都有各自的特性,比如
老鼠會打洞
貓會爬樹
鯊魚會游泳
不同種類有不同的天性。而在程式員的思維中, 動物是物件, 天性是這個類方法或者屬性。
再延伸一下,比如Python是面向物件程式語言。有List、Str、Dict、Tuple等資料型別,這些資料型別也是物件,比如List類可以有count方法,我們可以通過count方法統計列表中各個元素的數量。
我們可以簡單的將定義類理解成就是定義資料結構,同時給這種資料結構制定一些獨特的屬性或者方法。我們先看最簡單的類,在這裡我們定義了Point類
#為了顯示多個呼叫的變數 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = 'all' class Point(object): def __init__(self, x=0, y=0): self.x = x self.y = y def String(self): #顯示Point的資訊 return "{X:" +str(self.x) + ", Y:" + str(self.y) + "}"
呼叫類之前我們要例項化,這個可以理解成神筆馬良畫的畫,如果不將其搞活,永遠是畫。通過例項化,呼叫例項,畫中物件就活了。
#例項化Point類 point = Point(x=3, y=4) #顯示point物件 point #顯示point的String方法 point.String()
程式碼執行結果
<__main__.Point at 0x10d98ec18> '{X:3, Y:4}'
單繼承
白馬和黑馬,都是馬。
既然都是馬,所以不論黑馬白馬都有馬的特性,都可以奔跑。
所以我們可以定義一個基本的"馬類",之後讓"白馬類"和"黑馬類"繼承自"馬類"
像 白馬
和 黑馬
繼承 馬
,這就是單繼承。因為只是繼承了 一個 基類
。現在我們定義一個Circle類, 圓是由圓心和半徑決定的,所以Circle會繼承並使用Point的一些特性。
class Circle(Point): def __init__(self, x=0, y=0, radius=0): #Circle繼承並使用Point的__init__函式 Point.__init__(self, x, y) #不同於Point的引數radius self.radius = radius def String(self): #顯示Circle的資訊 return Point.String(self) + ", {Radius:" + str(self.radius) + "}"
現在我們看看Circle
#例項化Circle類 circle = Circle(x=3, y=2, radius=5) #顯示circle物件資訊 circle #顯示circle的String方法 circle.String()
程式碼執行結果
<__main__.Circle at 0x10d911c18> '{X:3, Y:2}, {Radius:5}'
多繼承
多繼承,顧名思義就是某個類繼承了多個父類(基類)
class Size(object): def __init__(self, width, height): self.width = width self.height = height def String(self): return "{Width: " + str(self.width) + ", Height: " + str(self.height) + "}"
繼續
#例項化Size物件 size = Size(width=5, height=3) size size.String()
執行結果
<__main__.Size at 0x10d97e828> '{Width: 5, Height: 3}'
現在已經有了Point、Size類,以及每個類中的String()方法。現在想構建 正四方形Rectangle類
。為了讓Rectangle具有Point和Size的一些特性,需要讓Rectangle繼承Point和Size的一些特有的方法。
class Rectangle(Point, Size): def __init__(self, x, y, width, height): #讓Rectangle使用Point中的init方法,使得Rectangle本身含有x和y屬性值 Point.__init__(self, x, y) #讓Rectangle使用Size中的init方法,使得Size本身含有width和height屬性值 Size.__init__(self, width, height) def String(self): return "Rectangle's init point is " + Point.String(self) + "; Size is " + Size.String(self)
Rectangle
繼承了 Point
和 Size
兩個類,使得Rectangle不用定義 x、y、width、height
。而且 Rectangle的String方法
可以直接呼叫 Point和Size物件的String方法
。
#例項化Rectangle rect = Rectangle(x=0, y=0, width=5, height=3) #呼叫rect rect #顯示其方法 rect.String()
執行結果
<__main__.Rectangle at 0x10d978390> "Rectangle's init point is {X:0, Y:0}; Size is {Width: 5, Height: 3}"
往期文章
ofollow,noindex">《用Python做文字分析》視訊教程