1.1 導(dǎo)入模塊執(zhí)行class語(yǔ)句
python導(dǎo)入模塊時(shí)會(huì)執(zhí)行class語(yǔ)句及主體內(nèi)的頂層語(yǔ)句。
示例
# test.py
class MyClass:
print('MyClass')
# cmd執(zhí)行下面語(yǔ)句
E:\\documents\\F盤>python
>>> import test
MyClass
1.2 pytho類接口技術(shù)
python類接口技術(shù)通過繼承實(shí)現(xiàn)。
# test.py
class Super:
'''定義一個(gè)超類。
定義一個(gè)method方法。
定義一個(gè)delegate方法,方法內(nèi)調(diào)用子類定義的action方法。
'''
def method(self):
print('in Super.method')
def delegate(self):
'''調(diào)用子類定義的action'''
self.action()
class Inheritor(Super):pass
class Replacer(Super):
'''定義 Replacer 繼承 Super
替換超類的 method 方法
'''
def method(self):
print('in Replacer.method')
class Extender(Super):
'''定義 Extender 繼承 Super
調(diào)用超類的 method 方法, 并且進(jìn)行擴(kuò)展
'''
def method(self):
print('Begin Extender.method')
Super.method(self)
print('End Extender.method')
class Provider(Super):
'''定義 Provider 繼承 Super
實(shí)現(xiàn)超類 delegate 內(nèi)調(diào)用的 action 方法
'''
def action(self):
print('in Provider.action')
if __name__ == '__main__':
for cls in (Inheritor,Replacer,Extender,Provider):
print('\\n{}....'.format(cls.__name__))
cls().method()
print('\\nProvider')
p = Provider()
p.delegate()
''' 運(yùn)行結(jié)果
E:\\documents\\F盤>python test.py
Inheritor....
in Super.method
Replacer....
in Replacer.method
Extender....
Begin Extender.method
in Super.method
End Extender.method
Provider....
in Super.method
Provider
in Provider.action
'''
1.3 python抽象超類
python類的部分行為由子類提供,則為抽象超類。
1.3.1 調(diào)用方法時(shí)觸發(fā)提示
顯式要求子類必須實(shí)現(xiàn)抽象超類的方法:
(1) 方法一,在超類方法用assert False
(2) 方法二,在超類方法用 raise NotImplementedError
未實(shí)現(xiàn),則在實(shí)例調(diào)用方法時(shí)觸發(fā)報(bào)錯(cuò)提示。
子類和超類都未提供方法 ,報(bào) has no attribute
>>> class AbsSuper:
def delegate(self):
self.action()
>>> class Provider(AbsSuper):pass
>>> p=Provider()
>>> p.delegate()
Traceback (most recent call last):
File ", line 1, in
在超類方法用assert False
>>> class AbsSuper:
def delegate(self):
self.action()
def action(self):
assert False,'子類必須定義 action'
>>> class Provider(AbsSuper):pass
>>> Provider().delegate()
Traceback (most recent call last):
File ", line 1, in
在超類方法用raise NotImplementedError
>>> class AbsSuper:
def delegate(self):
self.action()
def action(self):
raise NotImplementedError('子類必須定義 action')
>>> class Provider(AbsSuper):pass
>>> Provider().delegate()
Traceback (most recent call last):
File ", line 1, in
1.3.2 創(chuàng)建實(shí)例時(shí)觸發(fā)提示
(1) 帶有@abstractmethod修飾的方法為抽象方法。
(2) 帶有抽象方法的類不能進(jìn)行實(shí)例化。
(3) 超類有抽象方法時(shí),子類必須重寫超類的抽象方法。
(4) 未重寫,則創(chuàng)建實(shí)例時(shí)觸發(fā)報(bào)錯(cuò)提示。
抽象方法定義:
(1) python3:超類頭部括號(hào)送metaclass**=**ABCMeta。
(2) python2:超類主體定義**metaclass****=**ABCMeta。
(3) 用@abstractmethod修飾方法。
python3示例
>>> from abc import ABCMeta,abstractmethod
>>> class MySuper(metaclass=ABCMeta):
def delegate(self):
self.action()
# @abstractmethod 為抽象方法,子類必須重寫
@abstractmethod
def action(self):
pass # 抽象方法在父類通常留空,用pass進(jìn)行占位
>>> ms=MySuper()
Traceback (most recent call last):
File "
-
接口技術(shù)
+關(guān)注
關(guān)注
1文章
275瀏覽量
41371 -
Class
+關(guān)注
關(guān)注
0文章
53瀏覽量
19749 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84800
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論