面向对象的接口类 以及鸭子类型
?
1.接口類,抽象類.
2.鴨子類型(Python多態(tài))(Python三大特性之一)Python封裝
1.接口類和抽象類只是在工作中書寫的一種規(guī)范.
class QQ:
def? pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付寶支付%s"%money)
q = QQ()
q.pay(100)
a = Ali()
a.pay(200)
上面的例子,沒有統(tǒng)一化.不方便之后的開發(fā)
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() #這樣就實(shí)現(xiàn)了統(tǒng)一化
pay(q,100)
pay(a,200)
以上這版實(shí)現(xiàn)了統(tǒng)一化,但是交接的時(shí)候,新來的看不懂就會(huì)按照自己的方法寫.看下面
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() #新來的員工按照自己方法添加了一種,但是不規(guī)范.
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)
以上便是為了規(guī)避方法不統(tǒng)一的方法.下面的例子便是強(qiáng)制統(tǒng)一,不同一便報(bào)錯(cuò).
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) #強(qiáng)制統(tǒng)一化.沒有統(tǒng)一便會(huì)報(bào)錯(cuò)
pay(w,500)
抽象類(接口類)用處:在工作中,如果要是規(guī)定幾個(gè)類必須有一樣的方法,要抽象類.制定一個(gè)規(guī)范,強(qiáng)制其有此方法.
Python沒有多態(tài)的概念,但是Python崇尚鴨子類型.
Python中好多不同類但同名的方法不是強(qiáng)制規(guī)定,而是約定俗成的,像str,list,tuple這三種類,都同樣具有index方法,而且功能相似,則他們?nèi)齻€(gè)互稱為鴨子.
封裝就是將一些屬性或者方法(有用的信息)放置在一個(gè)空間中.
1.封裝? ? 對(duì)象的封裝
class? A:
def __init__(self,name,age):
self.name? = name
self.age = age
p = A("alex",23)
print(p.name)
2.封裝(私有成員)
類的結(jié)構(gòu)分析:
class Person:
mind = "有思想" #第一部分:所有的公有靜態(tài)變量,公有靜態(tài)字段
__level = "高等動(dòng)物" #第一步分:私有靜態(tài)變量,私有靜態(tài)字段
def __init__(self,name,age,sex): #構(gòu)造方法,第二部分:動(dòng)態(tài)方法,方法(函數(shù))
self.name = name
self.age = age #公有對(duì)象屬性
self.__sex = sex #私有對(duì)象屬性
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 = "高等動(dòng)物"
第二部分:特殊方法(__init__,__str__ ....)
普通方法:def func(self)
私有方法:def __func1(self)
類方法:@classmethod
靜態(tài)方法:@staticmethod
屬性:@property
私有成員:私有靜態(tài)字段,私有屬性,私有方法.在變量前加__雙下劃線.
class Animal:
__cloth = "有皮毛"
class Person(Animal):
mind = "有思想"
__level = "高等動(dòng)物"
def __init__(self,name,age):
self.name = name
self.age = age
?? def func(self):
print(self.__level) #類自己在內(nèi)部訪問自己的私有屬性
print(self._Animal__cloth) #知道這種方法可以,但是禁止使用.
print(self.__cloth) #派生類不可訪問父類的私有屬性
在類的外面訪問:私有靜態(tài)字段是訪問不到的.
p = Person("alex",100)
print(p.mind)
print(p.__level) #這樣訪問會(huì)報(bào)錯(cuò).
print(Person.__level) #這樣訪問也是會(huì)報(bào)錯(cuò)的.
print(Person.__dict__)
print(Person._Person__level) #這個(gè)方法知道就可以了,但是禁止使用.
#可以通過? ?對(duì)象._類名__變量名? 類名._類名__變量名? 可以訪問到,但是絕對(duì)不要這樣做
在類的內(nèi)部: 私有靜態(tài)字段是可以訪問的.
p.func()
父類的私有字段,派生類是否可以訪問? 答案是:不可以
print(p.__cloth)
p.func() #這兩種都會(huì)報(bào)錯(cuò).因?yàn)樵谕獠渴遣豢稍L問父類的私有字段.
私有方法:
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()
類的內(nèi)部可以訪問:
p.func1()
派生類也是訪問不到的
p.func2()
私有屬性也是類外部不能訪問,派生類不能訪問,只能類內(nèi)部訪問.
總結(jié):對(duì)于私有成員來說,加載到內(nèi)存時(shí),都會(huì)加上_類名__變量名,所以在類的外部或者派生類中都不可訪問.
為什么設(shè)置私有成員?
有些變量,方法,屬性只在類內(nèi)部進(jìn)行使用即可不便于(不允許)類外部或者派生類去調(diào)用.
class A:
def __init__(self):
self.__func()
def __func(self):
print("in? ?A")
class B(A):
def __func(self):
print("in? ?B")
b = B()
這是一道面試題, 打印的結(jié)果是什么,為什么結(jié)果是這樣的.
?
轉(zhuǎn)載于:https://www.cnblogs.com/fengkun125/p/9255743.html
總結(jié)
以上是生活随笔為你收集整理的面向对象的接口类 以及鸭子类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hpuoj--校赛--与学妹滑雪(最短路
- 下一篇: zabbix安装过程