初識面向對象-接口類、抽象類、封裝
阿新 • • 發佈:2019-04-03
問題 tac from 關系 私有屬性 style bstr fun chat
接口類
# java : 面向對象編程
# 設計模式 —— 接口
# 接口類 : python原生不支持
# 抽象類 : python原生支持的
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # 元類 默認的元類 type
@abstractmethod
def pay(self,money):pass # 沒有實現這個方法
# 規範 :接口類或者抽象類都可以
# 接口類 支持多繼承,接口類中的所有的方法都必須不能實現 —— java
# 抽象類 不支持多繼承,抽象類中方法可以有一些代碼的實現 —— java
class Wechat(Payment):
def pay(self,money):
print(‘已經用微信支付了%s元‘%money)
class Alipay(Payment):
def pay(self,money):
print(‘已經用支付寶支付了%s元‘ % money)
class Applepay(Payment):
def pay(self,money):
print(‘已經用applepay支付了%s元‘ % money)
def pay(pay_obj,money): # 統一支付入口
pay_obj.pay(money)
# wechat = Wechat()
# ali = Alipay()
app = Applepay()
# wechat.pay(100)
# ali.pay(200)
p = Payment()
接口類的多繼承
# tiger 走路 遊泳
# swan 走路 遊泳 飛
# oldying 走路 飛
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
class Tiger(Walk_Animal,Swim_Animal):
def walk(self):
pass
def swim(self):
pass
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass
# 接口類 剛好滿足接口隔離原則 面向對象開發的思想 規範
抽象類
#一切皆文件
import abc #利用abc模塊實現抽象類
class All_file(metaclass=abc.ABCMeta):
all_type=‘file‘
@abc.abstractmethod #定義抽象方法,無需實現功能
def read(self):
‘子類必須定義讀功能‘
with open(‘filaname‘) as f:
pass
@abc.abstractmethod #定義抽象方法,無需實現功能
def write(self):
‘子類必須定義寫功能‘
pass
class Txt(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print(‘文本數據的讀取方法‘)
def write(self):
print(‘文本數據的讀取方法‘)
class Sata(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print(‘硬盤數據的讀取方法‘)
def write(self):
print(‘硬盤數據的讀取方法‘)
class Process(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print(‘進程數據的讀取方法‘)
def write(self):
print(‘進程數據的讀取方法‘)
wenbenwenjian=Txt()
yingpanwenjian=Sata()
jinchengwenjian=Process()
#這樣大家都是被歸一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
# 抽象類 : 規範
# 一般情況下 單繼承 能實現的功能都是一樣的,所以在父類中可以有一些簡單的基礎實現
# 多繼承的情況 由於功能比較復雜,所以不容易抽象出相同的功能的具體實現寫在父類中
# 抽象類還是接口類 : 面向對象的開發規範 所有的接口類和抽象類都不能實例化
# java :
# java裏的所有類的繼承都是單繼承,所以抽象類完美的解決了單繼承需求中的規範問題
# 但對於多繼承的需求,由於java本身語法的不支持,所以創建了接口Interface這個概念來解決多繼承的規範問題
# python
# python中沒有接口類 :
# python中自帶多繼承 所以我們直接用class來實現了接口類
# python中支持抽象類 : 一般情況下 單繼承 不能實例化
# 且可以實現python代碼
多態
# 多態 python 天生支持多態
# def func(int num,str name):
# pass
#
# func(‘alex‘,2)
# class Payment:pass
# class Alipay():
# def pay(self,money):
# print(‘已經用支付寶支付了%s元‘ % money)
#
# class Applepay():
# def pay(self,money):
# print(‘已經用applepay支付了%s元‘ % money)
#
# def pay(pay_obj,money): # 統一支付入口 歸一化設計
# pay_obj.pay(money)
#
# pay()
# 什麽是多態
# python 動態強類型的語言
# 鴨子類型
# list tuple
# 不崇尚根據繼承所得來的相似
# 我只是自己實現我自己的代碼就可以了。
# 如果兩個類剛好相似,並不產生父類的子類的兄弟關系,而是鴨子類型
# list tuple 這種相似,是自己寫代碼的時候約束的,而不是通過父類約束的
# 優點 : 松耦合 每個相似的類之間都沒有影響
# 缺點 : 太隨意了,只能靠自覺
# class List():
# def __len__(self):pass
# class Tuple():
# def __len__(self):pass
#
# def len(obj):
# return obj.__len__()
#
# l = Tuple()
# len(l)
#
# # 強類型語言 多態
# # python 語言 鴨子類型
# 接口類和抽象類 在python當中的應用點並不是非常必要
封裝
# 廣義上面向對象的封裝 :代碼的保護,面向對象的思想本身就是一種
# 只讓自己的對象能調用自己類中的方法
# 狹義上的封裝 —— 面向對象的三大特性之一
# 屬性 和 方法都藏起來 不讓你看見
class Person:
__key = 123 # 私有靜態屬性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd # 私有屬性
def __get_pwd(self): # 私有方法
return self.__passwd #只要在類的內部使用私有屬性,就會自動的帶上_類名
def login(self): # 正常的方法調用私有的方法
self.__get_pwd()
alex = Person(‘alex‘,‘alex3714‘)
print(alex._Person__passwd) # _類名__屬性名
print(alex.get_pwd())
# 所有的私有 都是在變量的左邊加上雙下劃綫
# 對象的私有屬性
# 類中的私有方法
# 類中的靜態私有屬性
# 所有的私有的 都不能在類的外部使用
# 昨天的復習和博客
# 今天的作業、復習
# 預習封裝的內容
初識面向對象-接口類、抽象類、封裝