博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类继承、组合和抽象类
阅读量:5068 次
发布时间:2019-06-12

本文共 2522 字,大约阅读时间需要 8 分钟。

继承

继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类。

如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

class ParentClass1: #定义父类    passclass ParentClass2: #定义父类    passclass SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass    passclass SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类    pass

组合

软件重用的重要方式除了继承之外还有组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

>>> class Equip: #武器装备类...     def fire(self):...         print('release Fire skill')... >>> class Riven: #英雄Riven的类,一个英雄需要有装备,因而需要组合Equip类...     camp='Noxus'...     def __init__(self,nickname):...         self.nickname=nickname...         self.equip=Equip() #用Equip类产生一个装备,赋值给实例的equip属性... >>> r1=Riven('锐雯雯')>>> r1.equip.fire() #可以使用组合的类产生的对象所持有的方法release Fire skill

接口

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

      继承的第二种含义非常重要。它又叫“接口继承”。

接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

      归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

2. 为何要用接口
      接口提取了一群类共同的函数,可以把接口当做一个函数的集合。然后让子类去实现接口中的函数。

      这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

low版使用class模拟接口

# low版 模拟接口class Interface:    def read(self):        raise AttributeError    def write(self):        raise AttributeErrorclass Txt(Interface):    def read(self):        print("from txt read")    # def write(self):    #     print("from txt write")a = Txt()    #a.read()     # from txt reada.write()    # AttributeError

抽象类实现接口

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

# 抽象类abc:模拟接口,实现import abcclass Interface(metaclass=abc.ABCMeta):    @abc.abstractmethod    def read(self):        """子类必须定义读功能"""        psss    @abc.abstractmethod    def write(self):        """子类必须定义写功能"""        passclass Txt(Interface):    def read(self):        print("from txt read")    def write(self):        print("from txt write")class Sata(Interface):    def read(self):        print("from sata read")    def write(self):        print("from sata write")a = Txt()b = Sata()b.read()    # from sata read# b.write   # TypeError: Can't instantiate abstract class Sata with abstract methods writea.write()   # from txt writea.read()    # from txt write

转载于:https://www.cnblogs.com/zouruncheng/p/6734529.html

你可能感兴趣的文章
sql注入【手工及一些工具】
查看>>
所有的jsp页面都放到WEB-INF目录
查看>>
Android开发环境搭建全程演示(jdk+eclipse+android sdk)
查看>>
如何修改SVN中的用户名和密码
查看>>
(转) 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)...
查看>>
TJOI2011书架(dp)
查看>>
C++ p63作业 1
查看>>
第七课 Zookeeper配置管理,分布式锁案例,运维管理,运维管理系统
查看>>
数的划分(动态规划)
查看>>
.Net EntityFramework学习笔记
查看>>
挣值管理(EVT)
查看>>
20180711-Java Number类
查看>>
考试系统优化——准备工作
查看>>
Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
查看>>
Decker hello world
查看>>
crontab定时任务(待补充)
查看>>
转载:PostgreSQL学习手册(性能提升技巧)
查看>>
javascript学习笔记1
查看>>
LVM调整磁盘分区大小
查看>>
sql使用row_number()查询标记行号
查看>>