zoukankan      html  css  js  c++  java
  • python cookbook第三版学习笔记十六:抽象基类

    假设一个工程中有多个类,每个类都通过__init__来初始化参数。但是可能有很多高度重复且样式相同的__init__。为了减少代码。我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中,并将其定义在一个公共的基类中。示例如下:

    class structre():

        fileds=[]

        def __init__(self,*args):

            if len(args) != len(self.fileds):

                raise TypeError('Expected {} arguments'.format(len(self.fileds)))

            for name,value in zip(self.fileds,args):

                setattr(self,name,value)

    class stock(structre):

        fileds = ['name','shares','prices']

    class point(structre):

        fileds = ['x','y']

    class circle(structre):

        fileds = ['radius']

        def area(self):

            return math.pi * self.radius * 2

    if __name__=="__main__":

        s=stock('acme',50,91.1)

        p=point(2,3)

        c=circle(5)

        print(c.area())

    s1=stock('acme',60)

    在structure中,定义了filed列表用来存储子类传入的参数。并将filed存储的参数和初始化得到的arg参数进行比较。如果不相等。则抛出错误。

    运行结果如下:

    可以看到在运行s1=stock('acme',60)的时候,由于初始化的参数个数和filed中的不一致,所以抛出了异常。

    31.41592653589793

    Traceback (most recent call last):

      File "D:/py_prj/test2/cookbook.py", line 96, in <module>

        s1=stock('acme',60)

      File "D:/py_prj/test2/cookbook.py", line 70, in __init__

        raise TypeError('Expected {} arguments'.format(len(self.fileds)))

    TypeError: Expected 3 arguments

    8.12 抽象基类

    在java中,我们可以定义一个接口来指定需要的函数。在Python中我们也可以用一个类来实现接口的作用。这样可以在此之上执行类型检查并确保在子类中实现特定的方法

    定义一个抽象基类,需要使用abc模块。代码如下:

    class IStream(metaclass=ABCMeta):

        @abstractmethod

        def read(self,maxbytes=1):

            pass

        @abstractmethod

        def write(self,data):

            pass

    class sockstream(IStream):

        def read(self,maxbytes=-1):

            pass

    抽象基类的核心特征就是不能被直接实例化,否则会报错。比如当调用s= IStream()的时候会提示如下错误。

    Traceback (most recent call last):

      File "D:/py_prj/test2/cookbook.py", line 101, in <module>

        s=IStream()

    TypeError: Can't instantiate abstract class IStream with abstract methods read, write

    抽象基类的主要用途就是强制规定所需的编程接口。比如sockstream中并没有实现write方法,则会提示如下的错误:

    Traceback (most recent call last):

      File "D:/py_prj/test2/cookbook.py", line 101, in <module>

        s=sockstream()

    TypeError: Can't instantiate abstract class sockstream with abstract methods write

  • 相关阅读:
    svn版本控制器在vs2013中的使用
    在本地环境用虚拟机win2008 sever搭建VS2013 + SVN 代码版本控制环境
    luogu 2422 良好的感觉
    loj 10181 绿色通道
    luogu 2569 [SCOI2010]股票交易
    luogu 3946 ことりのおやつ(小鸟的点心)
    luogu 2865 [USACO06NOV]路障Roadblocks
    luogu 4554 小明的游戏
    luogu 2411 白银莲花池 && luogu 1606 Lilypad Pond
    luogu 2850 [USACO06DEC]虫洞Wormholes
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/9498943.html
Copyright © 2011-2022 走看看