接口类抽象类 封装
?
接口類抽象類:
第一版,不好,沒有統(tǒng)一化設(shè)計,第二版解決. 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) View Code 第二版 ,相安無事,此時來了一個野生程序員.完成了一個微信功能 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) # 統(tǒng)一化設(shè)計 pay(a1,200) w1 = Wechat() w1.wechatpay(500) View Code 第三版,重新改版微信支付功能 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) # 統(tǒng)一化設(shè)計 pay(a1,200) w1 = Wechat() pay(w1,500) View Code 第四版,為了避免上述野生程序員可能發(fā)生的問題,我要制定一個規(guī)范. class Payment: # 抽象類,或者接口類:制定一個規(guī)范.def pay(self):passclass 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) # 統(tǒng)一化設(shè)計 pay(a1,200) w1 = Wechat() pay(w1,500) View Code 第五版 強(qiáng)制制定規(guī)范,如果未按照規(guī)范執(zhí)行,就會報錯. from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta): # 抽象類 接口類 規(guī)范和約束 metaclass指定的是一個元類 @abstractmethoddef 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) # 統(tǒng)一化設(shè)計 pay(a1,200) w1 = Wechat() pay(w1,500) View Code 用處: 在工作中,如果你要是規(guī)定幾個類必須有一樣的方法, 你要抽象類,制定一個規(guī)范,強(qiáng)制其有此方法. python沒有多態(tài)的概念,但是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):passclass List:def index(self):passclass tuple:def index(self):pass View Code python中好多不同類但同名的方法不是強(qiáng)制規(guī)定,而是約定俗成,像上面這三種類,都同樣據(jù)有index方法,而且功能相似, 則 他們?nèi)齻€互稱為鴨子. 封裝: 封裝就是將一些屬性或者方法(有用的信息)放置在一個空間中. 1,封裝 對象的封裝. class Person:def __init__(self,name,age):self.name = nameself.age = age p1 = Person('oldboy',1000) p2 = Person('alex',10000) print(p1.name) print(p2.name) View Code 2 封裝(私有成員.) 類的結(jié)構(gòu)分析: class Person:mind = '有思想...' # 第一部分:所有的公有靜態(tài)變量,公有靜態(tài)字段__level = '高等動物' # 第一部分:私有靜態(tài)變量,私有靜態(tài)字段def __init__(self,name,age,sex): # 構(gòu)造方法 # 第二部分 動態(tài)方法,方法(函數(shù))self.name = name # 公有對象屬性self.age = ageself.__sex = sex # 私有對象屬性def func(self): # 第二部分:普通方法print(666)def __func1(self): # 第二部分:私有方法print(777)@staticmethod # 靜態(tài)方法def f2():pass@classmethod # 類方法def f2(self): pass@property # 屬性def hex(self):pass 類整體分類:第一部分: 公有靜態(tài)字段 mind = '有思想...' ,私有靜態(tài)字段. __level = '高等動物'第二部分: 特殊方法(__init__(公有屬性,私有屬性),__str__...)普通方法 def func(self)私有方法 def __func1(self):類方法:@classmethoddef f2(self): pass靜態(tài)方法:@staticmethod # 靜態(tài)方法def f2():pass屬性:@property # 屬性def hex(self): pass 私有成員: 私有靜態(tài)字段,私有屬性,私有方法 在變量前+ __雙下劃線. 私有靜態(tài)字段: class Animal:__cloth = '皮毛' # _Animal__clothclass Person(Animal):mind = '有思想...' # 第一部分:所有的公有靜態(tài)變量,公有靜態(tài)字段__level = '高等動物' # 第一部分:私有靜態(tài)變量,私有靜態(tài)字段 # _Person__leveldef __init__(self,name,age): # 構(gòu)造方法 # 第二部分 動態(tài)方法,方法(函數(shù))self.name = name # 公有對象屬性self.age = agedef func(self):print(self.__level)print(self._Animal__cloth)print(self.__cloth) View Code 在類的外面訪問: 私有靜態(tài)字段是訪問不到的. p1 = Person('alex',1000) print(p1.mind) print(p1.__level) print(Person.__level) print(Person.__dict__) print(Person._Person__level) View Code 可以通過對象._類名__變量名 類名._類名__變量名 可以訪問到,但是絕對不要這么訪問.在類的內(nèi)部: 私有靜態(tài)字段是可以訪問 p1 = Person('alex',1000) p1.func()父類的私有靜態(tài)字段,派生類可否訪問? 不可訪問. p1 = Person('alex',10) print(p1.__cloth) p1.func() 私有方法: class Animal:def __f1(self):print(1111) # _Animal__f1class Person(Animal):mind = '有思想...' # 第一部分:所有的公有靜態(tài)變量,公有靜態(tài)字段def __init__(self,name,age): # 構(gòu)造方法 # 第二部分 動態(tài)方法,方法(函數(shù))self.name = name # 公有對象屬性self.age = ageself.__sex = sexdef __func(self): # _Person__func()print(666)def func1(self):self.__func() # self._Person__func()def func2(self):self.__f1() # self._Person__f1() View Code 類外面訪問不到. p1 = Person('OLDBOY',1000) p1.__func() # 類內(nèi)部可以訪問. p1 = Person('OLDBOY',1000) p1.func1() 派生類中也是不能訪問的. p1.func2() 私有屬性 也是類外部不能訪問,派生類不能訪問,只能在類內(nèi)部訪問. class Animal:def __f1(self):print(1111) # _Animal__f1class Person(Animal):mind = '有思想...' # 第一部分:所有的公有靜態(tài)變量,公有靜態(tài)字段def __init__(self,name,age,sex): # 構(gòu)造方法 # 第二部分 動態(tài)方法,方法(函數(shù))self.name = name # 公有對象屬性self.age = ageself.__sex = sexdef __func(self): # _Person__func()print(666) View Code 總結(jié): 對于私有成員來說,他加載到內(nèi)存時,都會加上_類名__變量名,所以你在類的外部,或者派生類中都不可訪問. 為什么設(shè)置私有成員? 有些變量,方法,屬性,只在類內(nèi)部進(jìn)行使用即可,不便于(不允許)類外部或者派生類去調(diào)用. class Person:def __init__(self,username,password): # 構(gòu)造方法 # 第二部分 動態(tài)方法,方法(函數(shù))self.usn = username # 公有對象屬性self.__pwd = self.__makepassword()def __makepassword(self):'''復(fù)雜的加密過程'''new_pwd = self.__pwd + '666'return new_pwd p1 = Person('alex','123') print(p1.__pwd) View Code 面試題:class A:def __init__(self): # 2, self = b1對象空間self.__func() # 默認(rèn)_A__func() (私有屬性必須把前面的類加上) # 3, b1._A__func() def __func(self): # 4 , 默認(rèn)_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函數(shù),所有又去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()) View Code
?
抽象類接口類: 抽象類和接口類 —— 了解* 在python代碼中 抽象類和接口類沒有明顯的區(qū)別 主要就是維持了一種規(guī)范 一切皆對象 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):@abstractmethoddef pay(self,money):pass # 規(guī)范 View Code 多態(tài): python天生自帶多態(tài) 什么是多態(tài) java的多態(tài)是通過繼承實現(xiàn)的 class Foo:pass class list(Foo):pass class dict(Foo):pass class str(Foo):pass def len(a):print(a) len(1) View Code Python,動態(tài)解釋型強(qiáng)類型語言 弱類型 1+'2'參數(shù)的數(shù)據(jù)類型也不需要指定 強(qiáng)類型 同類型之間可以做運(yùn)算 參數(shù)的數(shù)據(jù)類型也需要指定 抽象類 : 子類必須實現(xiàn)父類中的同名方法——規(guī)范代碼在類的位置指定metaclass 是ABCMeta在指定的方法上面添加@abstractmethod裝飾器 目的:規(guī)范所有繼承這個類的子類 必須實現(xiàn)被@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) # 編程的習(xí)慣 —— 歸一化設(shè)計 wp.pay(100) ap = AliPay() payment(ap,100) ap.pay(100)app = ApplePay() payment(app,100) View Code 規(guī)范 接口類 python天生支持多繼承,對于python來說抽象類和接口類沒有區(qū)別 接口類是python特有的,因為python直接用類就可以實現(xiàn)接口的效果 python沒有‘接口這種數(shù)據(jù)類型,java中有 java語言是不支持多繼承的 from abc import ABCMeta,abstractmethod class Walk_Animal(metaclass=ABCMeta):@abstractmethoddef walk(self):passclass Fly_Animal(metaclass=ABCMeta):@abstractmethoddef fly(self):passclass Swim_Animal(metaclass=ABCMeta):@abstractmethoddef swim(self):passclass 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') View Code 封裝: 封裝 成一個函數(shù) 封裝 成一個類 封裝:面向?qū)ο蟮奶匦?class A: 私有靜態(tài)屬性:__靜態(tài)屬性 = 'aaa'#私有屬性print(__靜態(tài)屬性)#__靜態(tài)屬性,_類名__名字 在一個變量之前 ,加上兩個雙下劃線是有特殊意義的 加上了這個雙下劃線,這個變量就變成私有的 print(A.__靜態(tài)屬性) #報錯 私有的名字不能在類的外部使用 print(A.__dict__) print(A._A__靜態(tài)屬性)#從語法的角度上不允許你直接調(diào)用的 A.__wahaha = 'hahaha'#在一個類的外部是不可能定義一個私有的名字的 print(A.__dict__) 私有的對象屬性: class Room:def __init__(self,owner,id,length,width,height):self.owner = ownerself.id = idself.__length= lengthself.__width = widthself.__height = heightdef area(self):return self.__lenght*self.__width r = Room('文杰',302,2,1.5,0.5) print(r.area()) View Code 私有的方法: 不希望從外部去調(diào)用這個方法,不獨立完成一個功能,而是類整體完成某個功能的一部分。不能被子類繼承,在類的內(nèi)部使用的時候自動變形:類__名字 class Student:對密碼進(jìn)行加密def __init__(self,name,pwd):self.name = nameself.__pwd = pwddef __getpwd(self):return self.__pwd[::-1]def login(self):self.__getpwd() Student().__getpwd View Code 面試題: 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__funcprint('A') class B(A):# def __func(self):# print('B')def __init__(self):self.func() # _B__func() B() View Code 名字: 公有的 在類的外部用 內(nèi)部的 子類用 保護(hù)的 子類用 內(nèi)不用 __私有的 在類的內(nèi)部用?
轉(zhuǎn)載于:https://www.cnblogs.com/ls13691357174/p/9254005.html
總結(jié)
- 上一篇: ibatis 批量插入
- 下一篇: (二)行为化参数传递代码