1.接口類,抽象類.面試
2.鴨子類型(Python多態)(Python三大特性之一)Python封裝微信
1.接口類和抽象類只是在工做中書寫的一種規範.函數
class QQ:微信支付
def pay(self,money):spa
print("使用QQ支付%s"%money)對象
class Ali:接口
def pay(self,money):內存
print("使用支付寶支付%s"%money)支付寶
q = QQ()開發
q.pay(100)
a = Ali()
a.pay(200)
上面的例子,沒有統一化.不方便以後的開發
class QQ:
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付寶支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali() #這樣就實現了統一化
pay(q,100)
pay(a,200)
以上這版實現了統一化,可是交接的時候,新來的看不懂就會按照本身的方法寫.看下面
class QQ:
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付寶支付%s"%money)
class Wechat:
def wepay(self,money):
print("使用微信支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali()
pay(q,100)
pay(a,200)
w = Wechat() #新來的員工按照本身方法添加了一種,可是不規範.
w.wepay(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(self,money):
self.pay(money)
q = QQ()
a = Ali()
w = Wechat()
pay(q,100)
pay(a,200)
pay(w,500)
以上即是爲了規避方法不統一的方法.下面的例子即是強制統一,不一樣一便報錯.
from abc import ABCMeta , abstractmethod
class Payment(metaclass = ABCMeta):
@abstractmethod
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(self,money):
self.pay(money)
q = QQ()
a = Ali()
w = Wechat()
pay(q,100)
pay(a,200) #強制統一化.沒有統一便會報錯
pay(w,500)
抽象類(接口類)用處:在工做中,若是要是規定幾個類必須有同樣的方法,要抽象類.制定一個規範,強制其有此方法.
Python沒有多態的概念,可是Python崇尚鴨子類型.
Python中好多不一樣類但同名的方法不是強制規定,而是約定俗成的,像str,list,tuple這三種類,都一樣具備index方法,並且功能類似,則他們三個互稱爲鴨子.
封裝就是將一些屬性或者方法(有用的信息)放置在一個空間中.
1.封裝 對象的封裝
class A:
def __init__(self,name,age):
self.name = name
self.age = age
p = A("alex",23)
print(p.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
靜態方法:@staticmethod
屬性:@property
私有成員:私有靜態字段,私有屬性,私有方法.在變量前加__雙下劃線.
class Animal:
__cloth = "有皮毛"
class Person(Animal):
mind = "有思想"
__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) #派生類不可訪問父類的私有屬性
在類的外面訪問:私有靜態字段是訪問不到的.
p = Person("alex",100)
print(p.mind)
print(p.__level) #這樣訪問會報錯.
print(Person.__level) #這樣訪問也是會報錯的.
print(Person.__dict__)
print(Person._Person__level) #這個方法知道就能夠了,可是禁止使用.
#能夠經過 對象._類名__變量名 類名._類名__變量名 能夠訪問到,可是絕對不要這樣作
在類的內部: 私有靜態字段是能夠訪問的.
p.func()
父類的私有字段,派生類是否能夠訪問? 答案是:不能夠
print(p.__cloth)
p.func() #這兩種都會報錯.由於在外部是不可訪問父類的私有字段.
私有方法:
class Animal:
def f1(self):
print(111)
class Person(Animal):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.__sex = sex
def __func(self):
print(6666)
def func1(self):
self.__func()
def func2(self):
self.__f1()
類外面訪問不到:
p = Person("oldboy",200)
p.__func()
類的內部能夠訪問:
p.func1()
派生類也是訪問不到的
p.func2()
私有屬性也是類外部不能訪問,派生類不能訪問,只能類內部訪問.
總結:對於私有成員來講,加載到內存時,都會加上_類名__變量名,因此在類的外部或者派生類中都不可訪問.
爲何設置私有成員?
有些變量,方法,屬性只在類內部進行使用便可不便於(不容許)類外部或者派生類去調用.
class A:
def __init__(self):
self.__func()
def __func(self):
print("in A")
class B(A):
def __func(self):
print("in B")
b = B()
這是一道面試題, 打印的結果是什麼,爲何結果是這樣的.