什麼是多型:
多型指的是一類事物有多種形態,比如動物有多種形態:人、狗、豬
class animal: #同一類:動物
pass
class people(animal): #形態一:人
pass
class dog(animal): #形態二:狗
pass
class pig(animal): #形態三:豬
pass
為何要有多型
# 多型性指的是可以在不考慮物件具體型別的情況下而直接使用物件
class animal: # 統一所有子類的方法
def say(self):
print('動物基本的發聲頻率。。。',end=' ')
class people(animal):
def say(self):
super().say()
print('嚶嚶嚶嚶嚶嚶嚶')
class dog(animal):
def say(self):
super().say()
print('汪汪汪')
class pig(animal):
def say(self):
super().say()
print('哼哼哼')
obj1=people()
obj2=dog()
obj3=pig()
obj1.say()
obj2.say()
obj3.say()
動物基本的發聲頻率。。。 嚶嚶嚶嚶嚶嚶嚶
動物基本的發聲頻率。。。 汪汪汪
動物基本的發聲頻率。。。 哼哼哼
更進一步:可以定義統一的介面,接收傳入的動物物件
class animal: # 統一所有子類的方法
def say(self):
print('動物基本的發聲頻率。。。',end=' ')
class people(animal):
def say(self):
super().say()
print('嚶嚶嚶嚶嚶嚶嚶')
class dog(animal):
def say(self):
super().say()
print('汪汪汪')
class pig(animal):
def say(self):
super().say()
print('哼哼哼')
obj1=people()
obj2=dog()
obj3=pig()
# 定義統一的介面,接收傳入的動物物件
def animal_say(animal):
animal.say()
animal_say(obj1)
animal_say(obj2)
animal_say(obj3)
動物基本的發聲頻率。。。 嚶嚶嚶嚶嚶嚶嚶
動物基本的發聲頻率。。。 汪汪汪
動物基本的發聲頻率。。。 哼哼哼
鴨子型別:
python崇尚的「鴨子型別」(duck typing):「如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子」。比起繼承的方式,鴨子型別在某種程度上實現了程式的松耦合度,如下
class cpu:
def read(self):
print('cpu read')
def write(self):
print('cpu write')
class mem:
def read(self):
print('mem read')
def write(self):
print('mem write')
class txt:
def read(self):
print('txt read')
def write(self):
print('txt write')
obj1=cpu()
obj2=mem()
obj3=txt()
obj1.read()
obj1.write()
obj2.read()
obj2.write()
obj3.read()
obj3.write()
注:多型性的本質在於不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用物件,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名
繫結方法與非繫結方法
類中定義的函式分為兩大類:繫結方法和非繫結方法
其中繫結方法又分為繫結到物件的物件方法和繫結到類的類方法。
繫結方法:特殊之處在於將呼叫者本身當做第乙個引數自動傳入
繫結給物件的方法:呼叫者是物件,自動傳入的是物件
繫結給類的方法:呼叫者類,自動傳入的是類
在類中正常定義的函式預設是繫結到物件的,而為某個函式加上裝飾器@classmethod後,該函式就繫結到了類。
# 配置檔案settings.py的內容
host='127.0.0.1'
port=3306
# 類方法的應用
import settings
class mysql:
def __init__(self,ip,port):
self.ip=ip
self.port=port
def func(self):
print('%s:%s' %(self.ip,self.port))
@classmethod # 將下面的函式裝飾成繫結給類的方法
def from_conf(cls): # 從配置檔案中讀取配置進行初始化
# print(cls)
return cls(settings.ip, settings.port) #==>mysql(settings.ip, settings.port)再傳給init進行初始化
# obj1=mysql('1.1.1.1',3306)
obj2=mysql.from_conf() # 呼叫類方法,自動將類mysql當作第乙個引數傳給cls
print(obj2.__dict__)
print(obj2.ip,obj2.port)
127.0.0.0 3306
class data_test2(object):
day=0
month=0
year=0
def __init__(self,year=0,month=0,day=0):
self.day=day
self.month=month
self.year=year
@classmethod
def get_date(cls,string_date):
#這裡第乙個引數是cls, 表示呼叫當前的類名
year,month,day=map(int,string_date.split('-'))
date1=cls(year,month,day)
#返回的是乙個初始化後的類
return date1
def out_date(self):
print("year :",self.year)
print("month :",self.month)
print("day :",self.day)
r=data_test2.get_date("2016-8-6")
r.out_date()
year : 2016
month : 8
day : 6
繫結到類的方法就是專門給類用的,但其實物件也可以呼叫,只不過自動傳入的第乙個引數仍然是類,也就是說這種呼叫是沒有意義的,並且容易引起混淆
這也是python的物件系統與其他物件導向語言物件系統的區別之一,比如smalltalk和ruby中,繫結到類的方法與繫結到物件的方法是嚴格區分開的。
非繫結方法:
為類中某個函式加上裝飾器@staticmethod後,該函式就變成了非繫結方法,也稱為靜態方法。
該方法不與類或物件繫結,類與物件都可以來呼叫它,但它就是乙個普通函式而已,因而沒有自動傳值那麼一說
#沒有繫結給任何人:呼叫者可以是類、物件,沒有自動傳參的效果
class mysql:
def __init__(self,ip,port):
self.nid=self.create_id()
self.ip=ip
self.port=port
@staticmethod # 將下述函式裝飾成乙個靜態方法
def create_id():
import uuid
return uuid.uuid4()
obj1=mysql('1.1.1.1',3306)
# 靜態方法,對於類或者物件來說呼叫都是函式
# print(mysql.create_id) #
# print(obj1.create_id) #
# mysql.create_id(1,2,3) #通過類或物件就是函式,所以create_id函式需要有幾個引數就必須傳幾個引數
# obj1.create_id(4,5,6)
print(mysql.create_id())
總結繫結方法與非繫結方法的使用:
若類中需要乙個功能,該功能的實現**是給物件使用則將其定義成物件方法、是給類使用則將其定義成類方法、無需引用類或物件則將其定義成靜態方法。
多型與多型性
1.什麼是多型 多型指的是同一種 類事物的不同形態 2.為何要用多型性 1 增加了程式的靈活性 2 增加了程式的可擴張性 多型性 分為靜態多型性和動態多型性 多型性 在多型的背景下,可以在不用考慮物件具體型別的前提下而直接使用物件 多型性的精髓 統一 3.如何用多型 class animal def...
Python 多型與多型性
同一種事務的多種形態 就是多型 車有多種形態,你沒有具體學習某乙個物件,你是學的怎麼開車 這就是多型性 1 增加了程式的靈活性 以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func animal 2 增加了程式可擴充套件性 通過繼承animal類建立了乙個新的類,使用者無需改變自己...
類的多型與多型性
多型是指一類事物有多種形態 class animal def speak self print f 開口說話 動物的形態之一 人 class people animal def speak self print 呵呵呵 動物的形態之二 狗 class duck animal def speak se...