开发者社区> 问答> 正文

定义接口或者抽象基类

你想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法

展开
收起
哦哦喔 2020-04-17 15:05:16 960 0
1 条回答
写回答
取消 提交回答
  • 使用 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
    
    2020-04-17 15:05:24
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载