亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何定義接口和抽象類

瀏覽:7日期:2022-07-16 08:38:45

問題

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

解決方案

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

from abc import ABCMeta, abstractmethodclass IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): pass @abstractmethod def write(self, data): pass

抽象類的一個(gè)特點(diǎn)是它不能直接被實(shí)例化,比如你想像下面這樣做是不行的:

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

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

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

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

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

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

import io# Register the built-in I/O classes as supporting our interfaceIStream.register(io.IOBase)# Open a normal file and type checkf = open(’foo.txt’)isinstance(f, IStream) # Returns True

@abstractmethod 還能注解靜態(tài)方法、類方法和 properties 。 你只需保證這個(gè)注解緊靠在函數(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ù)字對(duì)象(整數(shù)、浮點(diǎn)數(shù)、有理數(shù)等)有關(guān)的基類。io 庫定義了很多跟I/O操作相關(guān)的基類。

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

import collections# Check if x is a sequenceif isinstance(x, collections.Sequence):...# Check if x is iterableif isinstance(x, collections.Iterable):...# Check if x has a sizeif isinstance(x, collections.Sized):...# Check if x is a mappingif isinstance(x, collections.Mapping):

盡管ABCs可以讓我們很方便的做類型檢查,但是我們?cè)诖a中最好不要過多的使用它。 因?yàn)镻ython的本質(zhì)是一門動(dòng)態(tài)編程語言,其目的就是給你更多靈活性, 強(qiáng)制類型檢查或讓你代碼變得更復(fù)雜,這樣做無異于舍本求末。

以上就是Python如何定義接口和抽象類的詳細(xì)內(nèi)容,更多關(guān)于Python定義接口和抽象類的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日本久久不射 | 国产亚洲精品久久综合影院 | 日本aaaa片毛片免费观看 | 特级一级毛片免费看 | 国产va免费精品高清在线观看 | 亚洲欧美日韩成人一区在线 | 可以免费看黄色的网站 | 97国产成人精品免费视频 | 国产在线一区在线视频 | 国产真实乱子伦精品视手机观看 | 国内外成人免费在线视频 | 美女视频黄a全部免费专区一 | 欧美在线高清视频播放免费 | 久久久久亚洲精品中文字幕 | 日本大臿亚洲香蕉大片 | 好叼操这里只有精品 | 亚洲高清国产品国语在线观看 | xx另类性欧美 | 国产成人免费网站 | 成人午夜兔费观看网站 | 99爱视频精品免视看 | 91理论片午午伦夜理片久久 | 一区二区三区高清在线 | 亚洲美女黄色片 | 亚洲成人黄色片 | 国产成人精品久久一区二区小说 | 免费成年人在线视频 | 国产日韩不卡免费精品视频 | 在线观看偷拍视频一区 | 国厂自拍 | 国产精品亚洲玖玖玖在线靠爱 | 久久精品成人免费看 | 九九99九九在线精品视频 | 欧美日本一区二区三区 | 亚洲一区二区影视 | 国产成人偷拍 | 一本久道久久综合婷婷五 | 国产三级国产精品国产国在线观看 | 中文字幕一区日韩在线视频 | 欧美性色黄大片www 欧美性色黄大片一级毛片视频 | 日韩一级免费毛片 |