class Wechat():
def pay(self,money):
print('已經用微信支付了%s元'%money)
class Alipay():
def pay(self,money):
print('已經用支付寶支付了%s元' % money)
wechat = Wechat()
ali = Alipay()
# wechat.pay(100)
# ali.pay(200)
#將上面兩句用下面的替換,
def pay(pay_obj,money): # 統一支付入口
pay_obj.pay(money)
pay(wechat,100)
pay(ali,200)
2,規範化程序java
class Applepay():
def zhifu(self,money):
print('已經用applepay支付了%s元' % money)
app = Applepay()
pay(app,100) #報錯
class Payment:
def pay(self,money):
raise NotImplementedError #拋出沒有實現這個方法的異常
class Applepay(Payment):
def zhifu(self,money):
print('已經用applepay支付了%s元' % money)
def pay(pay_obj,money): # 統一支付入口
pay_obj.pay(money)
app = Applepay()
pay(app,100) #報錯
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # 元類 默認的元類 type #metaclass不是繼承,而是指定元類
@abstractmethod
def pay(self,money):pass # 沒有實現這個方法
app = Applepay() #報錯
抽象類的本質仍是類,指的是一組類的類似性,包括數據屬性(如all_type)和函數屬性(如read、write),而接口只強調函數屬性的類似性。python
抽象類是一個介於類和接口直接的一個概念,同時具有類和接口的部分特性,能夠用來實現歸一化設計 git
在python中,並無接口類這種東西,即使不經過專門的模塊定義接口,咱們也應該有一些基本的概念。程序員
import abc
class Animal(metaclass=abc.ABCMeta): #同一類事物:動物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #動物的形態之一:人
def talk(self):
print('say hello')
class Dog(Animal): #動物的形態之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #動物的形態之三:豬
def talk(self):
print('say aoao')
class TxtFile: def read(self): pass def write(self): pass
class DiskFile: def read(self): pass def write(self): pass
class Person:
__key = 123 # 私有靜態屬性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd
# 在變量的左邊加上雙下劃線,就變成私有屬性 #變形爲:_Person__passwd
def __get_pwd(self): # 私有方法 #變形爲:_Person__get_pwd
return self.__passwd #只要在類的內部使用私有屬性,就會自動的帶上「_類名」,在外部這樣定義不會。
def login(self): # 正常的方法調用私有的方法,即只在內部使用
self.__get_pwd()
alex = Person('alex','alex3714')
print(alex._Person__passwd) # 「_類名或對象名__屬性名」能夠調出該屬性,可是不要用此方法在外部操做。
# print(alex.get_pwd()) #不可調用
6.2,能夠設置,get和set方法以便在外部更改查看私有屬性,可能會想爲何要畫蛇添足,不設成私有的不久行了嗎。微信
這樣寫有它的好處,便可以在get和set方法中加限定條件,以知足要求。因此,若是不須要對外限定保護屬性,能夠不用設定成私有的。app
class Room:
def __init__(self,name,length,width):
self.__name = name
self.__length = length
self.__width = width
def get_name(self): #不加限定條件的get
return self.__name
def set_name(self,newName): #加限定條件的set
if type(newName) is str and newName.isdigit() == False:
self.__name = newName
else:
print('不合法的姓名')
def area(self):
return self.__length * self.__width
jin = Room('金老闆',2,1)
print(jin.area())
jin.set_name('2')
print(jin.get_name())
6.3,假設父類的私有屬性 能被子類調用麼?,不會函數
class Foo:
__key = '123' #變形爲: _Foo__key
class Son(Foo):
print(Foo.__key) #繼承屬性後變形爲: _Son__key
6.4,會用到私有的這個概念de場景
1.隱藏起一個屬性 不想讓類的外部調用
2.我想保護這個屬性,不想讓屬性隨意被改變
3.我想保護這個屬性,不被子類繼承微信支付