一、定義類
在面向對象的程序設計中有兩種重要概念:
- 類:可以理解為一個種類,一個模型,是一種抽象的東西。
- 實例、對象:可以理解為一種具體制作或者存在的東西。
定義類的語法格式如下:
class 類名: 執行語句 零到多個類變量 零到多個類方法
例如我們需要制作一只碗,首先需要這個碗的模型就是類,在制作這個碗的過程就叫做實例化,制作出來的碗就是實例、對象;這個碗在中國制作,就是類變量;而這個碗的顏色、材料就是這個類的實例變量,具體請看下面代碼:
class BowlModel: make_in = 'China' # 類變量,不需要實例化就調用 def __init__(self,colour = 'red',material = 'lron'): # __init__方法一般用來對實例的屬性進行初始化 # 下面兩個是實例變量 self.colour = colour self.material = material print ('顏色:',self.colour,'材料:',self.material) # 定義make方法 def make(self,name): print (name,'制作了一只',self.colour,self.material,'碗。')
關於網上一些說__init__是構造函數,一些說__new__才是真正的構造函數,這里找了一些資料大致解析如下:
老式類中其實並沒有 __new__ 方法,因為 __init__ 就是它的構造方法(函數)。
新式類允許開發者根據他們的意圖來重寫 __new__ 和 __init__ 方法。__new__ (構造函數)單獨地創建一個對象,而 __init__ (初始化函數)負責初始化這個對象。
二、使用和創建對象
創建對象時,實際是調用了__new__方法,返回當前對象的一個實例,當實例被創建出來后,會調用__init__方法,對當前對象的實例初始化,沒有返回值。
創建對象例:
# 調用BowlModel的構造方法,返回一個BowlModel對象 # 在創建實例對象時,__ini__執行了一次 # 將BowlModel對象賦值給a變量 a = BowlModel() ''' 這里在執行時,過程可以理解為: a = object.__new__(BowlModel) print (a) # 返回當前對象的實例,打印 <__main__.BowlModel object at 0x0000000002E2CCC0> print (BowlModel.__init__(a)) # 執行了一次__init__方法,打印 顏色: red 材料: lron 返回 None ''' print (a) # 打印 <__main__.BowlModel object at 0x0000000002E2CD68>
當創建完對象之后,就可以對對象的實例變量進行操作(增、刪、改、查),也可以調用和增加對象的方法。
具體語法如下:
對象.方法(參數) 對象.變量
對對象的實例變量進行增、刪、改、查如下:
# 訪問對象的變量 print (BowlModel.make_in) print (a.make_in) # 訪問a實例,直接為colour實例變量賦值 a.colour = 'green' print (vars(a)) # 返回當前范圍局部變量的字典,打印 {'colour': 'green', 'material': 'lron'} # 輸出a的material實例變量 print (a.material) # 打印 lron # 為a對象動態增加factory實例變量 a.factory = '陶瓷廠' print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron', 'factory': '陶瓷廠'} # 使用del語句,動態刪除a對象的factory實例變量 del a.factory print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron'}
調用對象的方法例:
# 調用a對象的make方法,因為第一參數是自動綁定的,只需要為第二個參數傳入一個值 a.make('老王') # 打印 老王 制作了一只 green lron 碗。
為對象動態增加方法,例:
def company(self,company_name): print (company_name,'在制作一只',self.colour,self.material,'碗。') a.cy = company #print (a.cy('大大陶瓷廠')) # 報錯 TypeError: company() missing 1 required positional argument: 'company_name' # 由於Pyhon不會自動將調用者綁定到第一個參數self,故需要手動將調用者綁定到第一個參數 a.cy(a,'大大陶瓷廠') # 打印 大大陶瓷廠 在制作一只 green lron 碗。
當然也可以利用lambda表達式為a對象動態增加方法,例:
a.use = lambda self,people : print (people,'正在使用一只',self.colour,self.material,'碗。') # 同樣需要手動將調用者綁定到第一個參數 a.use(a,'大明') # 打印 大明 正在使用一只 green lron 碗。
如果想讓a對象動態增加的方法自動綁定第一個參數,可以使用types模塊下的MethodType進行包裝,例:
test = lambda self,tester : print (tester,'正在測試一只',self.colour,self.material,'碗。') from types import MethodType # 使用MethodType對test進行包裝,將第一個參數自動綁定為a a.test = MethodType(test,a) a.test('小宗') # 打印 小宗 正在測試一只 green lron 碗。