物件導向程式設計
一種程式設計思想。把物件作為程式的基本單元,
物件包含資料和運算元據的函式。在Python中,所有資料型別都可以視為物件
宣告類
class Student(object): #類
def __init__(self, name, score): #方法
self.name = name
self.score = score #屬性
bart=Student() #例項
複製程式碼
物件導向特點:資料封裝、繼承、多型
資料封裝:直接用內部定義函式訪問資料(不用知道內部細節)
呼叫方法:bart.print_score()
訪問限制:使內部屬性不被外部訪問(以_開頭的變數),只是習慣,仍可被修改訪問
繼承:子類可繼承父類的功能
多型:子類繼承父類型別,同時具有多種資料型別
獲取物件資訊方法:
type() 返回一個類
isinstance(,) 返回布林值
dir() 返回所有屬性和方法
操作物件狀態:
getattr(obj,'a','b') 若a不存在則返回b
setattr(obj,a,b) 將b賦給a
hasattr(obj,a) 判斷有無a
例項變數:給例項繫結屬性;類屬性:直接在class中定義屬性(名字不能相同)
__slots__變數:限制該class例項能新增的屬性
@property:將一個方法變成屬性呼叫
多重繼承:讓一個子類繼承多個父類
MixIn:給單個類增加多個功能
定製類:
def __str__(self):
return 'Student object (name=%s)' % self.name #自定返回值,美化且能提取關鍵資訊
__repr__ = __str__ #順便把除錯內容定義
複製程式碼
__iter__方法:返回一個迭代物件
例:斐波那契數列:
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數器a,b
def __iter__(self):
return self # 例項本身就是迭代物件,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 計算下一個值
if self.a > 100000: # 退出迴圈的條件
raise StopIteration()
return self.a # 返回下一個值
>>> for n in Fib():
... print(n)
複製程式碼
__getitem__方法:使其list一樣能用能用下標訪問元素、可切片
__getattr__方法:動態返回一個屬性(找不到時)
def __getattr__(self, attr):
if attr=='score':
return 99
複製程式碼
__call__方法:可直接對例項進行呼叫
callable()函式:判斷一個物件是否是“可呼叫”物件
列舉型別:Enum類
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
複製程式碼
精確地控制列舉型別,可以從Enum派生出自定義類:
from enum import Enum, unique
@unique #裝飾器,保證無重複值
class Weekday(Enum):
Sun = 0 # Sun的value被設定為0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
複製程式碼
type()函式既可以返回一個物件的型別,又可以動態建立類
依次傳入3個引數:class的名稱;繼承的父類集合;class的方法名稱與函式繫結。
元類:metaclass