接口類抽象類:java
初版,很差,沒有統一化設計,第二版解決.
class QQ: def pay(self,money): print('您用qq支付了%s元' % money) class Ali: def pay(self,money): print('您用支付寶支付了%s元' % money) q1 = QQ() q1.pay(100) a1 = Ali() a1.pay(200)
第二版 ,相安無事,此時來了一個野生程序員.完成了一個微信功能
class QQ: def pay(self,money): print('您用qq支付了%s元' % money) class Ali: def pay(self,money): print('您用支付寶支付了%s元' % money) class Wechat: def wechatpay(self,money): print('您用微信支付了%s元' % money) def pay(obj,money): obj.pay(money) # q1.pay(100) q1 = QQ() a1 = Ali() pay(q1,100) # 統一化設計 pay(a1,200) w1 = Wechat() w1.wechatpay(500)
第三版,從新改版微信支付功能
class QQ: def pay(self,money): print('您用qq支付了%s元' % money) class Ali: def pay(self,money): print('您用支付寶支付了%s元' % money) class Wechat: def pay(self,money): print('您用微信支付了%s元' % money) def pay(obj,money): obj.pay(money) # q1.pay(100) q1 = QQ() a1 = Ali() pay(q1,100) # 統一化設計 pay(a1,200) w1 = Wechat() pay(w1,500)
第四版,爲了不上述野生程序員可能發生的問題,我要制定一個規範.
class Payment: # 抽象類,或者接口類:制定一個規範. def pay(self):pass class QQ(Payment): def pay(self,money): print('您用qq支付了%s元' % money) class Ali(Payment): def pay(self,money): print('您用支付寶支付了%s元' % money) class Wechat(Payment): def pay(self,money): print('您用微信支付了%s元' % money) def pay(obj,money): obj.pay(money) # a1.pay(200) q1 = QQ() a1 = Ali() pay(q1,100) # 統一化設計 pay(a1,200) w1 = Wechat() pay(w1,500)
第五版 強制制定規範,若是未按照規範執行,就會報錯.
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): # 抽象類 接口類 規範和約束 metaclass指定的是一個元類 @abstractmethod def pay(self):pass # 抽象方法 class QQ(Payment): def pay(self,money): print('您用qq支付了%s元' % money) def ret(self): print('支付失敗....') class Ali(Payment): def pay(self,money): print('您用支付寶支付了%s元' % money) class Wechat(Payment): def pay(self,money): print('您用微信支付了%s元' % money) def pay(obj,money): obj.pay(money) # a1.pay(200) q1 = QQ() a1 = Ali() w1 = Wechat() q1 = QQ() a1 = Ali() pay(q1,100) # 統一化設計 pay(a1,200) w1 = Wechat() pay(w1,500)
用處: 在工做中,若是你要是規定幾個類必須有同樣的方法, 你要抽象類,制定一個規範,強制其有此方法. python沒有多態的概念,可是python崇尚鴨子類型. 定義變量的方法: 1,java c# 須要定義 類型. int i= 3 2,java c# 沒有多繼承的概念. i = 1 i = 'alex'
鴨子類型: 它看着像鴨子,那麼他就是鴨子.
str list tuple str.index() s1 = 'alex' class Str: def index(self): pass class List: def index(self): pass class tuple: def index(self): pass
python中好多不一樣類但同名的方法不是強制規定,而是約定俗成,像上面這三種類,都一樣據有index方法,並且功能類似, 則 他們三個互稱爲鴨子.
封裝: 封裝就是將一些屬性或者方法(有用的信息)放置在一個空間中. 1,封裝 對象的封裝.
class Person: def __init__(self,name,age): self.name = name self.age = age p1 = Person('oldboy',1000) p2 = Person('alex',10000) print(p1.name) print(p2.name)
2 封裝(私有成員.) 類的結構分析:
class Person: mind = '有思想...' # 第一部分:全部的公有靜態變量,公有靜態字段 __level = '高等動物' # 第一部分:私有靜態變量,私有靜態字段 def __init__(self,name,age,sex): # 構造方法 # 第二部分 動態方法,方法(函數) self.name = name # 公有對象屬性 self.age = age self.__sex = sex # 私有對象屬性 def func(self): # 第二部分:普通方法 print(666) def __func1(self): # 第二部分:私有方法 print(777) @staticmethod # 靜態方法 def f2():pass @classmethod # 類方法 def f2(self): pass @property # 屬性 def hex(self):pass
類總體分類: 第一部分: 公有靜態字段 mind = '有思想...' ,私有靜態字段. __level = '高等動物' 第二部分: 特殊方法(__init__(公有屬性,私有屬性),__str__...) 普通方法 def func(self) 私有方法 def __func1(self): 類方法: @classmethod def f2(self): pass 靜態方法: @staticmethod # 靜態方法 def f2():pass 屬性: @property # 屬性 def hex(self): pass 私有成員: 私有靜態字段,私有屬性,私有方法 在變量前+ __雙下劃線.
私有靜態字段:
class Animal: __cloth = '皮毛' # _Animal__cloth class Person(Animal): mind = '有思想...' # 第一部分:全部的公有靜態變量,公有靜態字段 __level = '高等動物' # 第一部分:私有靜態變量,私有靜態字段 # _Person__level def __init__(self,name,age): # 構造方法 # 第二部分 動態方法,方法(函數) self.name = name # 公有對象屬性 self.age = age def func(self): print(self.__level) print(self._Animal__cloth) print(self.__cloth)
在類的外面訪問: 私有靜態字段是訪問不到的.
p1 = Person('alex',1000) print(p1.mind) print(p1.__level) print(Person.__level) print(Person.__dict__) print(Person._Person__level)
能夠經過對象._類名__變量名 類名._類名__變量名 能夠訪問到,可是絕對不要這麼訪問. 在類的內部: 私有靜態字段是能夠訪問 p1 = Person('alex',1000) p1.func() 父類的私有靜態字段,派生類能否訪問? 不可訪問. p1 = Person('alex',10) print(p1.__cloth) p1.func()
私有方法:
class Animal: def __f1(self):print(1111) # _Animal__f1 class Person(Animal): mind = '有思想...' # 第一部分:全部的公有靜態變量,公有靜態字段 def __init__(self,name,age): # 構造方法 # 第二部分 動態方法,方法(函數) self.name = name # 公有對象屬性 self.age = age self.__sex = sex def __func(self): # _Person__func() print(666) def func1(self): self.__func() # self._Person__func() def func2(self): self.__f1() # self._Person__f1()
類外面訪問不到. p1 = Person('OLDBOY',1000) p1.__func() # 類內部能夠訪問. p1 = Person('OLDBOY',1000) p1.func1() 派生類中也是不能訪問的. p1.func2() 私有屬性 也是類外部不能訪問,派生類不能訪問,只能在類內部訪問.
class Animal: def __f1(self):print(1111) # _Animal__f1 class Person(Animal): mind = '有思想...' # 第一部分:全部的公有靜態變量,公有靜態字段 def __init__(self,name,age,sex): # 構造方法 # 第二部分 動態方法,方法(函數) self.name = name # 公有對象屬性 self.age = age self.__sex = sex def __func(self): # _Person__func() print(666)
總結: 對於私有成員來講,他加載到內存時,都會加上_類名__變量名,因此你在類的外部,或者派生類中都不可訪問. 爲何設置私有成員? 有些變量,方法,屬性,只在類內部進行使用便可,不便於(不容許)類外部或者派生類去調用.
class Person: def __init__(self,username,password): # 構造方法 # 第二部分 動態方法,方法(函數) self.usn = username # 公有對象屬性 self.__pwd = self.__makepassword() def __makepassword(self): '''複雜的加密過程''' new_pwd = self.__pwd + '666' return new_pwd p1 = Person('alex','123') print(p1.__pwd)
面試題:
class A: def __init__(self): # 2, self = b1對象空間 self.__func() # 默認_A__func() (私有屬性必須把前面的類加上) # 3, b1._A__func() def __func(self): # 4 , 默認_A__func() b1._A__func() print('IN A') # print(in A ) class B(A): def __func(self): print('IN B') b1 = B() 1, #B裏面沒有去A裏面找 class A: def __init__(self): # 2,self = b1對象空間 self.func() # 3,b1.func() #b1裏面有func函數,全部又去b1裏面找 def func(self): print('IN A') class B(A): def func(self): print('IN B') # 4 print(IN B) b1 = B() # 1,B沒有去A裏面找b1屬性 # print(b1.name) # print(b1.func) print(b1.func) print(b1.func())
抽象類接口類: 抽象類和接口類 —— 瞭解* 在python代碼中 抽象類和接口類沒有明顯的區別 主要就是維持了一種規範 一切皆對象
a = 1 dic = {'k':'v'} lst = [1,2,3] def func(): pass print(type(func)) len(lst) print(dic.__len__(),len(dic)) def len(lst): return lst.__len__() print(len) from abc import ABCMeta,abstractmethod class Pay(metaclass=ABCMeta): @abstractmethod def pay(self,money):pass # 規範
多態:
python天生自帶多態
什麼是多態
java的多態是經過繼承實現的
class Foo:pass class list(Foo):pass class dict(Foo):pass class str(Foo):pass def len(a): print(a) len(1)
Python,動態解釋型強類型語言 弱類型 1+'2'參數的數據類型也不須要指定 強類型 同類型之間能夠作運算 參數的數據類型也須要指定 抽象類 : 子類必須實現父類中的同名方法——規範代碼 在類的位置指定metaclass 是ABCMeta 在指定的方法上面添加@abstractmethod裝飾器 目的:規範全部繼承這個類的子類 必須實現被@abstractmethod裝飾器裝飾的這個方法 特色:抽象類和接口類只能被繼承不能被實例化
class WechatPay(Pay): def pay(self,money): print('微信支付了%s元'%money) class AliPay(Pay): def pay(self, money): print('支付寶支付了%s元' % money) class ApplePay(Pay): def pay(self,money): print('apple支付了%s元' % money) def payment(obj,money): obj.pay(money) wp = WechatPay() payment(wp,100) # 編程的習慣 —— 歸一化設計 wp.pay(100) ap = AliPay() payment(ap,100) ap.pay(100) app = ApplePay() payment(app,100)
規範
接口類
python天生支持多繼承,對於python來講抽象類和接口類沒有區別
接口類是python特有的,由於python直接用類就能夠實現接口的效果
python沒有‘接口這種數據類型,java中有
java語言是不支持多繼承的
from abc import ABCMeta,abstractmethod class Walk_Animal(metaclass=ABCMeta): @abstractmethod def walk(self):pass class Fly_Animal(metaclass=ABCMeta): @abstractmethod def fly(self):pass class Swim_Animal(metaclass=ABCMeta): @abstractmethod def swim(self):pass class Tiger(Walk_Animal,Swim_Animal): def walk(self): print('walk') def swim(self): print('swim') class Parrot: def walk(self): print('walk') def fly(self): print('fly') class Swan: def walk(self): print('walk') def fly(self): print('fly') def swim(self): print('swim')
封裝: 封裝 成一個函數 封裝 成一個類 封裝:面向對象的特性 class A: 私有靜態屬性: __靜態屬性 = 'aaa'#私有屬性 print(__靜態屬性)#__靜態屬性,_類名__名字 在一個變量以前 ,加上兩個雙下劃線是有特殊意義的 加上了這個雙下劃線,這個變量就變成私有的 print(A.__靜態屬性) #報錯 私有的名字不能在類的外部使用 print(A.__dict__) print(A._A__靜態屬性)#從語法的角度上不容許你直接調用的 A.__wahaha = 'hahaha'#在一個類的外部是不可能定義一個私有的名字的 print(A.__dict__)
私有的對象屬性:
class Room: def __init__(self,owner,id,length,width,height): self.owner = owner self.id = id self.__length= length self.__width = width self.__height = height def area(self): return self.__lenght*self.__width r = Room('文傑',302,2,1.5,0.5) print(r.area())
私有的方法:
不但願從外部去調用這個方法,不獨立完成一個功能,而是類總體完成某個功能的一部分。不能被子類繼承,在類的內部使用的時候自動變形:類__名字
class Student: 對密碼進行加密 def __init__(self,name,pwd): self.name = name self.__pwd = pwd def __getpwd(self): return self.__pwd[::-1] def login(self): self.__getpwd() Student().__getpwd
面試題:
class A: def __init__(self): self.__func() #self._A__func() def __func(self): print('A') class B(A): def __func(self): print('B') B() # _B__func() class A: def __init__(self): self.__func() def __func(self): #_A__func print('A') class B(A): # def __func(self): # print('B') def __init__(self): self.func() # _B__func() B()
名字: 公有的 在類的外部用 內部的 子類用 保護的 子類用 內不用 __私有的 在類的內部用