Python在設計之初就是一門面向對象的語言。
一、技術簡介
類(class):用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。
實例變量:定義在方法中的變量,只作用於當前實例的類。
方法:類中定義的函數。
對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
實例化:創建一個類的實例,類的具體對象。
二、類
class Calculator: price = 11 #類變量 def add(self,x,y): #求和的一個方法;x,y都是實例變量 print (self.price) #調用類變量 print(x+y) def divide(self,x,y): #求商的一個方法 print (x/y) def minus(self,x,y): #求差的一個方法 print (x-y) cal = Calculator() #類的實例化,cal就是一個對象 cal.add(2,3) #調用類中的add方法 cal.divide(6,3) cal.minus(3,2) 輸出結果爲: 11 5 2.0 1
很多類傾向於將對象創建爲有初始狀態的。因此類可能會定義一個名爲_init_()的特殊方法(構造函數)
class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart x = Complex(3.0, -4.5) print(x.r, x.i) #輸出結果:3.0 -4.5
類的方法與普通的函數只有一個特別的區別,就是它們必須有一個額外的第一參數名稱,慣例名稱是self。其中self代表類的實例,而不是類。而且self不是關鍵字,可以隨意起名字。
三、類的繼承和方法的重寫
class parent: def child(self): print ('調用父類') class Child(parent): #繼承類parent pass class Child_level(parent): #繼承類parent def child(self): #方法child的重寫 print ('調用子類') p = parent() p.child() c = Child() c.child() c_level = Child_level() c_level.child()
出現多個繼承時,注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索。
四、構造函數(__init__)
class Ball: def __init__(self,name,age): self.name = name self.age = age print (name,age) def kick(self): print ('我叫%s,今年%s.剛纔誰踢我。。'%(self.name,self.age)) c = Ball('土豆',22) c.kick()
init前後包含雙下劃線。
五、私有變量、方法
class person: __name = '鏈家網' def get_name(self): print (self.__name) def __getAge(self): print ('私有方法') p = person() p.get_name() p._person__getAge()
私有變量只需在變量、方法前面添加“__”雙下劃線。私有變量原則上不允許外部訪問,但是python沒有絕對的私有,都是僞私有。可以通過“p._person__getAge()”、"p._person__name"直接訪問私有方法、變量。即通過“_類名__變量名”的樣式訪問。
六、小技巧
類中組合,巧妙的避免了繼承
class Turtle: def __init__(self,x): self.num = x class fish: def __init__(self,y): self.num = y class Pool: def __init__(self,x,y): self.turtle = Turtle(x) #組合(類的實例化放在一個類裏面) self.fish = fish(y) #組合(類的實例化放在一個類裏面) def print_num(self): print ('水池中共有%s只甲魚,共有%d條魚'%(self.turtle.num,self.fish.num)) p = Pool(2,11) p.print_num()