zoukankan      html  css  js  c++  java
  • python接口、抽象类与抽象方法

    接口:
    -url
    -数据类型,python不存在
    class 类名
    1、类中的方法可以写任意多个
    2、如果想要对类中的方法做约束,就需要写接口
    接口中定义一个方法f1,可以约束继承他的子类
    class 接口:
       def f1(self):
        pass
    class 类名(接口):
      pass
    示例:
    class IOrderRepository:(一般接口类默认为I大写开头)

      def fetch_one_by(self,nid):
        """
        所有继承当前类的类必须实现该方法
        """
        raise Execption('子类中必须实现该方法')
    class OrderRepository(IOrderRepository):#继承接口
      def fetch_one_by(self,nid):
        print(123123)
    #由于python中无接口类型,所以需要人为的构造出来(在父类接口类中增加异常触发raise Execption('子类中必须实现该方法'))

    由于python 没有抽象类、接口的概念,所以要实现这种功能得abc.py 这个类库,具体方式如下

    from abc import ABCMeta, abstractmethod
    
    #抽象类
    class Headers(object):
        __metaclass__ = ABCMeta
    
        def __init__(self):
            self.headers = ''
    
        @abstractmethod
        def _getBaiduHeaders(self):pass
    
        def __str__(self):
            return str(self.headers)
    
        def __repr__(self):
            return repr(self.headers)
    
    #实现类
    class BaiduHeaders(Headers):
        def __init__(self, url, username, password):
            self.url = url
            self.headers = self._getBaiduHeaders(username, password)
    
        def _getBaiduHeaders(self, username, password):
            client = GLOBAL_SUDS_CLIENT.Client(self.url)
            headers = client.factory.create('ns0:AuthHeader')
            headers.username = username
            headers.password = password
            headers.token = _baidu_headers['token']
            return headers
    

      如果子类不实现父类的_getBaiduHeaders方法,则抛出TypeError: Can't instantiate abstract class BaiduHeaders with abstract methods  异常

    1
    2
    3
    4
    5
    6
    7
    8
    class Foo(object):
        def exec(self):
            raise NotImplementedError('请实现exec方法')
     
    class A(Foo):
        pass
    obj=A()
    obj.exec()

      类A继承类Foo,因而拥有类Foo的所有属性。类A实例化一个对象obj,obj调用exec()方法,如果类A自己没有定义exec方法,就会抛出异常。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from abc import abstractmethod,ABCMeta
     
    class Foo(metaclass=ABCMeta):
        @abcstractmethod
        def exec(self):
            pass
     
    class A(Foo):
        pass
    obj=A()

      从abc模块调用类abstractmethod和类ABCMeta,自己定义类Foo,继承抽象类ABCMeta,在类Foo中定义exec方法,并添加装饰器abcstractmethod。定义类A继承类Foo,并实例化对象obj,类A中必须有类Foo中的方法否则就会抛出异常。

  • 相关阅读:
    使用yum命令报错
    CentOS6.8安装Python3.6.3
    解决 linux 下安装 node 报: command not found
    Python的pip源切换为国内阿里云镜像
    开源Java加密工具Jasypt 1.4发布
    JavaFX对Java开发者到底意味着什么?
    16 个印象深刻的 HTML5/CSS3/JavaScript 体验
    高效的Java异常处理
    Java开发的学习过历程
    Java中23种设计模式详解
  • 原文地址:https://www.cnblogs.com/qiangayz/p/9352159.html
Copyright © 2011-2022 走看看