Python面向?qū)ο笾^承和組合用法實(shí)例分析
本文實(shí)例講述了Python面向?qū)ο笾^承和組合用法。分享給大家供大家參考,具體如下:
面向?qū)ο蟮慕M合用法
軟件重用的重要方式除了繼承之外還有另外一種方式,即:組合
組合指的是,在一個(gè)類中以另外一個(gè)類的對(duì)象作為數(shù)據(jù)屬性,稱為類的組合
圓環(huán)是由兩個(gè)圓組成的,圓環(huán)的面積是外面圓的面積減去內(nèi)部圓的面積。圓環(huán)的周長(zhǎng)是內(nèi)部圓的周長(zhǎng)加上外部圓的周長(zhǎng)。
這個(gè)時(shí)候,我們就首先實(shí)現(xiàn)一個(gè)圓形類,計(jì)算一個(gè)圓的周長(zhǎng)和面積。然后在"環(huán)形類"中組合圓形的實(shí)例作為自己的屬性來(lái)用
# -*-coding:utf-8 -*-
#! python3
from math import pi
class Circle:
'''
定義了一個(gè)圓形類;
提供計(jì)算面積(area)和周長(zhǎng)(perimeter)的方法
'''
def __init__(self,radius):
self.radius = radius
def area(self):
return pi * self.radius * self.radius
def perimeter(self):
return 2 * pi *self.radius
circle = Circle(10) #實(shí)例化一個(gè)圓
area1 = circle.area() #計(jì)算圓面積
per1 = circle.perimeter() #計(jì)算圓周長(zhǎng)
print(area1,per1) #打印圓面積和周長(zhǎng)
class Ring:
'''
定義了一個(gè)圓環(huán)類
提供圓環(huán)的面積和周長(zhǎng)的方法
'''
def __init__(self,radius_outside,radius_inside):
self.outsid_circle = Circle(radius_outside)
self.inside_circle = Circle(radius_inside)
def area(self):
return self.outsid_circle.area() - self.inside_circle.area()
def perimeter(self):
return self.outsid_circle.perimeter() + self.inside_circle.perimeter()
ring = Ring(10,5) #實(shí)例化一個(gè)環(huán)形
print(ring.perimeter()) #計(jì)算環(huán)形的周長(zhǎng)
print(ring.area()) #計(jì)算環(huán)形的面積
運(yùn)行結(jié)果:
314.1592653589793 62.83185307179586
94.24777960769379
235.61944901923448
繼承
繼承是一種創(chuàng)建新類的方式,在python中,新建的類可以繼承一個(gè)或多個(gè)父類,父類又可稱為基類或超類,新建的類稱為派生類或子類
python中類的繼承分為:?jiǎn)卫^承和多繼承
查看繼承
>>> SubClass1.__bases__ #__base__只查看從左到右繼承的第一個(gè)子類,__bases__則是查看所有繼承的父類 (<class '__main__.ParentClass1'>,) >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
提示:如果沒有指定基類,python的類會(huì)默認(rèn)繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實(shí)現(xiàn)。
>>> ParentClass1.__bases__ (<class 'object'>,) >>> ParentClass2.__bases__ (<class 'object'>,)
繼承與抽象(先抽象再繼承)
抽象即抽取類似或者說(shuō)比較像的部分。
抽象分成兩個(gè)層次:
1.將奧巴馬和梅西這倆對(duì)象比較像的部分抽取成類;
2.將人,豬,狗這三個(gè)類比較像的部分抽取成父類。
抽象最主要的作用是劃分類別(可以隔離關(guān)注點(diǎn),降低復(fù)雜度)
繼承:是基于抽象的結(jié)果,通過(guò)編程語(yǔ)言去實(shí)現(xiàn)它,肯定是先經(jīng)歷抽象這個(gè)過(guò)程,才能通過(guò)繼承的方式去表達(dá)出抽象的結(jié)構(gòu)。
抽象只是分析和設(shè)計(jì)的過(guò)程中,一個(gè)動(dòng)作或者說(shuō)一種技巧,通過(guò)抽象可以得到類
繼承與重用性
在開發(fā)程序的過(guò)程中,如果我們定義了一個(gè)類A,然后又想新建立另外一個(gè)類B,但是類B的大部分內(nèi)容與類A的相同時(shí)
我們不可能從頭開始寫一個(gè)類B,這就用到了類的繼承的概念。
通過(guò)繼承的方式新建類B,讓B繼承A,B會(huì)‘遺傳'A的所有屬性(數(shù)據(jù)屬性和函數(shù)屬性),實(shí)現(xiàn)代碼重用
派生
當(dāng)然子類也可以添加自己新的屬性或者在自己這里重新定義這些屬性(不會(huì)影響到父類),需要注意的是,一旦重新定義了自己的屬性且與父類重名,那么調(diào)用新增的屬性時(shí),就以自己為準(zhǔn)了。
在子類中,新建的重名的函數(shù)屬性,在編輯函數(shù)內(nèi)功能的時(shí)候,有可能需要重用父類中重名的那個(gè)函數(shù)功能,應(yīng)該是用調(diào)用普通函數(shù)的方式,即:類名.func(),此時(shí)就與調(diào)用普通函數(shù)無(wú)異了,因此即便是self參數(shù)也要為其傳值.
在python3中,子類執(zhí)行父類的方法也可以直接用super方法.
# -*-coding:utf-8 -*-
#! python3
class A:
def hahaha(self):
print('A')
class B(A):
def hahaha(self):
super().hahaha()
#super(B,self).hahaha()
#A.hahaha(self)
print('B')
a = A()
b = B()
b.hahaha()
super(B,b).hahaha()
運(yùn)行結(jié)果:
A
B
A
通過(guò)繼承建立了派生類與基類之間的關(guān)系,它是一種'是'的關(guān)系,比如白馬是馬,人是動(dòng)物。
當(dāng)類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如教授是老師
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python面向?qū)ο笾惖睦^承詳解
- Python面向?qū)ο蠓庋b繼承和多態(tài)示例講解
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承、多態(tài)原理與用法詳解
- Python面向?qū)ο笾^承原理與用法案例分析
- Python 面向?qū)ο笾庋b、繼承、多態(tài)操作實(shí)例分析
- Python面向?qū)ο笾^承和多態(tài)用法分析
- Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài)詳解
- Python3.5面向?qū)ο笈c繼承圖文實(shí)例詳解
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)類的封裝與繼承用法示例
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)多繼承和多態(tài)用法示例
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之類的定義與繼承簡(jiǎn)單示例
- Python面向?qū)ο笾惖亩x與繼承用法示例
- Python面向?qū)ο箢惥帉懠?xì)節(jié)分析【類,方法,繼承,超類,接口等】
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程【類,實(shí)例,繼承,重載等】
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承與多繼承用法分析
- Python面向?qū)ο箢惖睦^承實(shí)例詳解
- Python面向?qū)ο箢惱^承和組合實(shí)例分析
- Python 面向?qū)ο缶幊痰娜筇匦灾^承
相關(guān)文章
對(duì)Python 語(yǔ)音識(shí)別框架詳解
今天小編就為大家分享一篇對(duì)Python 語(yǔ)音識(shí)別框架詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python基礎(chǔ)教程之正則表達(dá)式基本語(yǔ)法以及re模塊
正則表達(dá)式是可以匹配文本片段的模式,今天的Python就跟大家一起討論一下python中的re模塊,python re模塊感興趣的朋友一起學(xué)習(xí)吧2016-03-03
centos6.5安裝python3.7.1之后無(wú)法使用pip的解決方案
今天小編就為大家分享一篇關(guān)于centos6.5安裝python3.7.1之后無(wú)法使用pip的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
手機(jī)Python編程軟件QPython支持第三方庫(kù)安裝詳解
這篇文章主要為大家介紹了手機(jī)Python編程軟件QPython的推薦使用,支持第三方庫(kù)安裝,這樣大家在上下班途中也可以來(lái)練練手啦,有需要的朋友一起用起來(lái)吧2021-10-10
caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解
今天小編就為大家分享一篇caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python實(shí)現(xiàn)的matplotlib動(dòng)畫演示之細(xì)胞自動(dòng)機(jī)
這篇文章主要介紹了Python實(shí)現(xiàn)的matplotlib動(dòng)畫演示之細(xì)胞自動(dòng)機(jī),用python來(lái)模擬,首先嘗試表示Beacon,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

