python 面向对象学习
生活随笔
收集整理的這篇文章主要介紹了
python 面向对象学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
面向對象
1、面向對象一些基本的定義
- 類(class):用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
- 方法:類中定義的函數。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
- 數據成員:類變量或者實例變量用于處理類及其實例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
- 局部變量:定義在方法中的變量,只作用于當前實例的類。
- 實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
- 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal)。
- 實例化:創建一個類的實例,類的具體對象。
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
接下來用一個例子來說明這些定義:
class Student: #定義一個名為 Student 的類age=20 #定義 Student 類的屬性,公有變量__name='' #私有變量def a(self): #定義 Student 類的方法,self 代表類的實例return self.age class Student1(Student): #類的繼承def show(self):print(self.age+1) p=Student1() #創建了一個類的實例 print(p.a()) p.show()結果為:
?
?類還有一些專有方法:
- __init__ : 構造函數,在生成對象時調用
- __del__ : 析構函數,釋放對象時使用
- __repr__ : 打印,轉換
- __setitem__ : 按照索引賦值
- __getitem__: 按照索引獲取值
- __len__: 獲得長度
- __cmp__: 比較運算
- __call__: 函數調用
- __add__: 加運算
- __sub__: 減運算
- __mul__: 乘運算
- __truediv__: 除運算
- __mod__: 求余運算
- __pow__: 乘方
?
類的三個要素:封裝、繼承、多態 。
封裝 :根據 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中。
繼承 :實現代碼的重用,相同的代碼不需要重復的編寫。
多態 :不同的對象調用相同的方法,產生不同的執行結果,增加代碼的靈活度。
?
?
類class中以下劃線開頭的變量名特點:
?
1、單下劃線"_":?
在Python中,通過單下劃線"“來實現模塊級別的私有化,變量除外。一般約定以單下劃線”"開頭的函數為模塊私有的,也就是說"from moduleName import * “將不會引入以單下劃線”_"開頭的函數。 2、雙下劃線"__": 對于Python中的類屬性,可以通過雙下劃線"__“來實現一定程度的私有化,因為雙下劃線開頭的屬性在運行時會被"混淆”。雙下劃線的另一個重要的目地是,避免子類對父類同名屬性的沖突。 總結:"__“和” _ __"的使用 更多的是一種規范/約定,并沒有真正達到限制的目的: “_”:以單下劃線開頭的表示的是protected類型的變量,即只能允許其本身與子類進行訪問;同時表示弱內部變量標示,如,當使用"from moduleNmae import *"時,不會將以一個下劃線開頭的對象引入。
“__”:雙下劃線的表示的是私有類型的變量。只能是允許這個類本身進行訪問了,連子類也不可以,這類屬性在運行時屬性名會加上單下劃線和類名。
設計一個三維向量類,并實現向量的加法、減法以及向量與標量的乘法和除法代碼如下:
?
class Vecter3:def __init__(self, x=0, y=0, z=0):self.X = xself.Y = yself.Z = zdef __add__(self, n):r = Vecter3()r.X = self.X + n.Xr.Y = self.Y + n.Yr.Z = self.Z + n.Zreturn rdef __sub__(self, n): r = Vecter3()r.X = self.X - n.Xr.Y = self.Y - n.Yr.Z = self.Z - n.Zreturn rdef __mul__(self, n):r = Vecter3()r.X = self.X * nr.Y = self.Y * nr.Z = self.Z * nreturn rdef __truediv__(self, n):r = Vecter3()r.X = self.X / nr.Y = self.Y / nr.Z = self.Z / nreturn rdef __floordiv__(self, n):r = Vecter3()r.X = self.X // nr.Y = self.Y // nr.Z = self.Z // nreturn rdef show(self): #輸出運算后的三維坐標print((self.X,self.Y,self.Z)) x1,y1,z1=map(eval,input("請輸入第一個三維向量的坐標:").split(',')) x2,y2,z2=map(eval,input("請輸入第二個三維向量的坐標:").split(',')) v1=Vecter3(x1,y1,z1) v2=Vecter3(x2,y2,z2) v3 = v1+v2 v3.show() v4=v1-v2 v4.show() n=eval(input("請輸入標量n:")) v5=v1*n v5.show() v6=v1/n v6.show()運行代碼后,結果為:
?
?
字符串匹配(輸入一段英文,輸出只有三個字符的單詞):
?
import re a=[] words=input("Input the words:") l=re.split('[\. ]+',words) i=0 for i in l:if len(i)==3: if i not in a:a.append(i)else:continue for k in range(0,len(a)):print(a[k],end=' ')?
結果為:
?
轉載于:https://www.cnblogs.com/guangshixiaoshuaiqiang/p/10716307.html
總結
以上是生活随笔為你收集整理的python 面向对象学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [AT2369] [agc013_c]
- 下一篇: UVA_11922 Permutatio