中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python定義接口和抽象類的方法

發布時間:2020-07-30 09:52:47 來源:億速云 閱讀:166 作者:小豬 欄目:開發技術

這篇文章主要講解了Python定義接口和抽象類的方法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

問題

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

解決方案

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

from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
  @abstractmethod
  def read(self, maxbytes=-1):
    pass

  @abstractmethod
  def write(self, data):
    pass

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

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

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

class SocketStream(IStream):
  def read(self, maxbytes=-1):
    pass

  def write(self, data):
    pass

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

def serialize(obj, stream):
  if not isinstance(stream, IStream):
    raise TypeError('Expected an IStream')
  pass

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

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 。 你只需保證這個注解緊靠在函數定義前即可:

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操作相關的基類。

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

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定義接口和抽象類的方法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽源市| 九江市| 嘉善县| 通山县| 辽阳县| 沈阳市| 克什克腾旗| 鄂伦春自治旗| 沅江市| 扎赉特旗| 合江县| 平利县| 正定县| 民县| 荥阳市| 新郑市| 弥渡县| 石河子市| 韶关市| 女性| 甘孜| 和田县| 邢台市| 通化市| 赤峰市| 临西县| 新竹市| 延长县| 宜昌市| 肇东市| 万荣县| 青川县| 洪泽县| 田阳县| 乌恰县| 迁安市| 五莲县| 峨眉山市| 宽甸| 隆子县| 德保县|