最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何定義接口和抽象類

 更新時間:2020年07月28日 16:27:45   作者:David Beazley  
這篇文章主要介紹了Python如何定義接口和抽象類,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

問題

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

解決方案

使用 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

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

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

  def write(self, data):
    pass

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

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

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

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 還能注解靜態(tài)方法、類方法和 properties 。 你只需保證這個注解緊靠在函數(shù)定義前即可:

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

討論

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

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

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的本質(zhì)是一門動態(tài)編程語言,其目的就是給你更多靈活性, 強制類型檢查或讓你代碼變得更復(fù)雜,這樣做無異于舍本求末。

以上就是Python如何定義接口和抽象類的詳細內(nèi)容,更多關(guān)于Python定義接口和抽象類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

永平县| 商水县| 遵化市| 桐庐县| 定南县| 神农架林区| 清水河县| 滨州市| 德保县| 乐山市| 吉隆县| 崇州市| 彭州市| 黄冈市| 淮安市| 嘉黎县| 留坝县| 墨竹工卡县| 禄丰县| 汶上县| 银川市| 万年县| 新安县| 综艺| 衡南县| 同德县| 常德市| 炉霍县| 卢龙县| 鄱阳县| 揭东县| 泗洪县| 峨眉山市| 阿鲁科尔沁旗| 静宁县| 会理县| 会宁县| 中西区| 永安市| 克拉玛依市| 阿城市|