Python3 從零單排19_組合&多型
阿新 • • 發佈:2018-12-19
組合 :物件1的屬性是物件2,物件1就擁有了物件2的資料和函式屬性,這就是組合。
# A型別和B型別沒有共性,不可以繼承,但是A有B的特性,比如A是人,B是家,A和B沒有繼承關係,但是人有家,A有B的關係,那麼就可以把B的屬性都給A用 class people: def __init__(self,name,age): self.name = name self.age = age def say_hi(self): print("hi my name is %s"%self.name) class home:def __init__(self,adress,area,height): self.adress = adress self.area = area self.heaight = height def home_info(self): print("地址:%s,面積:%s"%(self.adress,self.area)) xg = people("曉鋼",18) hourse = home("地球",1000,10) xg.hourse = hourse xg.hourse.home_info() #地址:地球,面積:1000
抽象類:抽取一些類的共性作為一個類,比如水果類,人類。抽象類能被繼承,但是不能被例項化。
當函式屬性用裝飾器abc.abstractmethod裝飾的時候,子類必須按照抽象類的定義實現這個固定的函式屬性,否則報錯。
import abc #需要用到abc這個模組來定義抽象類 class animal(metaclass=abc.ABCMeta): @abc.abstractmethod #abc.abstractmethod 裝飾後,該類的所有子類必須含有該方法才不會報錯 def run(self): print("people is running!") def sleep(self): pass class people(animal): def run(self): #必須定義run方法才可以,否則報錯 pass
多型:同一類事物的多種形態
import abc class Animal(metaclass=abc.ABCMeta): #同一類事物:動物 @abc.abstractmethod def talk(self): # animal的所有子類都必須實現talk方法,否則報錯 pass class People(Animal): #動物的形態之一:人 def talk(self): print('say hello') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('say wangwang') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('say aoao') class Cat(Animal): #動物的形態之三:貓 def talk(self): print('say miamiao') #多型性:指的是可以在不考慮物件的型別的情況下而直接使用物件方法 從而擴充套件性高 peo1=People() dog1=Dog() pig1=Pig() cat1=Cat() # peo1.talk() # dog1.talk() # pig1.talk() def func(animal): animal.talk() func(peo1) func(pig1) func(dog1) func(cat1)
鴨子型別 不同類定義的函式或者資料屬性名字相同,不同物件在呼叫這些屬性時,看上去都是一樣的屬性,實現功能也一樣,但內部程式碼邏輯並不一樣。
class Disk: def read(self): print('disk read') def write(self): print('disk write') class Text: def read(self): print('text read') def write(self): print('text write') # f=open(...) # f.read() # f.write() disk=Disk() text=Text() disk.read() disk.write() text.read() text.write()
序列型別是典型的鴨子型別:列表list,元祖tuple,字串str
l=list([1,2,3]) t=tuple(('a','b')) s=str('hello') # # # print(l.__len__()) # # print(t.__len__()) # # print(s.__len__()) # # # def len(obj): # # return obj.__len__() print(len(l)) print(len(t)) print(len(s))