python如何定义抽象类_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如何定义接口和抽象类的详细内容,更多关于python定义接口和抽象类的资料请关注萬仟网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值