一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python如何定義接口和抽象類

Python如何定義接口和抽象類

2020-07-29 11:39David Beazley Python

這篇文章主要介紹了Python如何定義接口和抽象類,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

問題

你想定義一個接口或抽象類,并且通過執行類型檢查來確保子類實現了某些特定的方法

解決方案

使用 abc 模塊可以很輕松的定義抽象基類:

?
1
2
3
4
5
6
7
8
9
10
from abc import ABCMeta, abstractmethod
 
class IStream(metaclass=ABCMeta):
  @abstractmethod
  def read(self, maxbytes=-1):
    pass
 
  @abstractmethod
  def write(self, data):
    pass

抽象類的一個特點是它不能直接被實例化,比如你想像下面這樣做是不行的:

?
1
2
a = IStream() # TypeError: Can't instantiate abstract class
        # IStream with abstract methods read, write

抽象類的目的就是讓別的類繼承它并實現特定的抽象方法:

?
1
2
3
4
5
6
class SocketStream(IStream):
  def read(self, maxbytes=-1):
    pass
 
  def write(self, data):
    pass

抽象基類的一個主要用途是在代碼中檢查某些類是否為特定類型,實現了特定接口:

?
1
2
3
4
def serialize(obj, stream):
  if not isinstance(stream, IStream):
    raise TypeError('Expected an IStream')
  pass

除了繼承這種方式外,還可以通過注冊方式來讓某個類實現抽象基類:

?
1
2
3
4
5
6
7
8
import io
 
# Register the built-in I/O classes as supporting our interface
IStream.register(io.IOBase)
 
# Open a normal file and type check
f = open('foo.txt')
isinstance(f, IStream) # Returns True

@abstractmethod 還能注解靜態方法、類方法和 properties 。 你只需保證這個注解緊靠在函數定義前即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A(metaclass=ABCMeta):
  @property
  @abstractmethod
  def name(self):
    pass
 
  @name.setter
  @abstractmethod
  def name(self, value):
    pass
 
  @classmethod
  @abstractmethod
  def method1(cls):
    pass
 
  @staticmethod
  @abstractmethod
  def method2():
    pass

討論

標準庫中有很多用到抽象基類的地方。collections 模塊定義了很多跟容器和迭代器(序列、映射、集合等)有關的抽象基類。 numbers 庫定義了跟數字對象(整數、浮點數、有理數等)有關的基類。io 庫定義了很多跟I/O操作相關的基類。

你可以使用預定義的抽象類來執行更通用的類型檢查,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import collections
 
# Check if x is a sequence
if isinstance(x, collections.Sequence):
...
 
# Check if x is iterable
if isinstance(x, collections.Iterable):
...
 
# Check if x has a size
if isinstance(x, collections.Sized):
...
 
# Check if x is a mapping
if isinstance(x, collections.Mapping):

盡管ABCs可以讓我們很方便的做類型檢查,但是我們在代碼中最好不要過多的使用它。 因為Python的本質是一門動態編程語言,其目的就是給你更多靈活性, 強制類型檢查或讓你代碼變得更復雜,這樣做無異于舍本求末。

以上就是Python如何定義接口和抽象類的詳細內容,更多關于Python定義接口和抽象類的資料請關注服務器之家其它相關文章!

原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c08/p12_define_interface_or_abstract_base_class.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人aa久久狼窝动画 | 亚洲精品动漫在线观看 | 日韩成人在线免费视频 | 好大好猛好爽好深视频免费 | 亚洲午夜小视频 | 国产91在线精品 | 亚洲福利 影院 | 亚洲国产麻豆 | 丝瓜黄瓜茄子西红柿秋葵榴莲 | 亚洲区一 | 亚洲精品精品一区 | fuqer日本老师 | 日韩理论片 | 日韩欧美亚洲每日更新网 | 视频在线观看高清免费 | 1024国产高清精品推荐 | 久久88综合 | 亚洲国产在线视频精品 | 男人的天堂在线观看免费 | 国产精品久久久久jk制服 | 97菊爱网| 国产精品一区三区 | 1986葫芦兄弟全集免费观看第十集 | 夫妇交换小说 | 国产精品视频色拍拍 | 无码专区aaaaaa免费视频 | 国产亚洲精品一区二区在线播放 | 国产丰满美女做爰 | 久99视频精品免费观看福利 | 亚洲精品福利一区二区在线观看 | 亚洲a在线视频 | 亚洲国产在线观看免费视频 | 成熟女人50岁一级毛片不卡 | 色哟呦| 俺去啦最新地址 | 国内老司机精品视频在线播出 | 国产成人免费高清激情明星 | 无人视频在线观看完整版高清 | 免费在线观看亚洲 | 精品在线观看一区 | www.青青操|