色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

Python如何定義接口和抽象類

瀏覽:4日期: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

除了繼承這種方式外,還可以通過注冊方式來讓某個(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ù)字對象(整數(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可以讓我們很方便的做類型檢查,但是我們在代碼中最好不要過多的使用它。 因?yàn)镻ython的本質(zhì)是一門動(dòng)態(tài)編程語言,其目的就是給你更多靈活性, 強(qiáng)制類型檢查或讓你代碼變得更復(fù)雜,這樣做無異于舍本求末。

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日韩国产欧美一区二区三区 | 久久2017| 中文字幕精品一区二区精品 | 中国三级网站 | 15—17女人毛片| 久久综合精品国产一区二区三区无 | 欧美极品第1页专区 | 泷泽萝拉亚洲精品中文字幕 | 亚洲天堂久久 | 人成午夜| 精品午夜一区二区三区在线观看 | 男人天堂网在线视频 | 国产三区视频在线观看 | 理论在线看 | 在线成年人网站 | 日产日韩亚洲欧美综合搜索 | 成人在线精品视频 | 成人欧美一区二区三区黑人 | 永久免费不卡在线观看黄网站 | 九九久久精品 | 国产精品久久久久久影院 | 亚洲一区二区视频 | 国产三级理论 | 一级毛片免费在线 | 成人18免费观看的软件 | 亚洲欧美一区二区三区久本道 | 国产精品系列在线一区 | 成人免费大片黄在线观看com | 欧美一级精品高清在线观看 | 国产高清美女一级毛片久久 | 亚色网站| 国产免费福利体检区久久 | 欧美成人tv在线观看免费 | 亚洲欧美日韩久久一区 | 国产呦在线观看视频 | 香蕉亚洲精品一区二区 | 国产全部理论片线观看 | 玖玖精品 | 欧美 亚洲 丝袜 清纯 中文 | 台湾精品视频在线观看 | 美女视频大全网站免费 |