面向对象----继承,组合

来源:互联网 发布:函数的定义c语言 编辑:程序博客网 时间:2024/05/29 09:30

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

python中类的继承分为:单继承和多继承

class Father:#父类    def __init__(self,name):        self.name=name    def foo(self):        return 'foo from {} '.format(self.name)class Mom:#父类    def __init__(self,age):        self.age=ageclass Son(Father,Mom):#子类,继承Father,Mom的数据属性和函数属性    def __init__(self,name,age,hobby):        Father.__init__(self,name)        Mom.__init__(self,age)        self.hobby=hobby
查看继承
print(Son.__bases__)#(<class '__main__.Father'>, <class '__main__.Mom'>)print(Father.__bases__)#(<class 'object'>,)print(Mom.__bases__)#(<class 'object'>,)
提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

==============================================

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

class People:#     def __init__(self,name,age,sex):#         self.name=name#         self.age=age#         self.sex=sex#     def walk(self):#         print('{} walking'.format(self.name))## class Fraction:#     def __init__(self,fraction):#         self.fraction=fraction#     def frac(self):#         print('分数是{}'.format(self.fraction))# class Course:#     def __init__(self,course):#         self.course=course##     def cour(self):#         print('课程是{}'.format(self.course))## class Date:#     def __init__(self,year,mun,day):#         self.year=year#         self.mun=mun#         self.day=day#     def date(self):#         print('{}年{}月{}日'.format(self.year,self.mun,self.day))
# class Teacher(People):#     def __init__(self,name,age,sex,course,year,mun,day,level,salary):#             People.__init__(self,name,age,sex)#             self.course=Course(course)             #组合#             self.date=Date(year,mun,day)#             self.level=level#             self.salary=salary#     def teach(self):#         print('{} is teaching'.format(self.name))## class Student(People):#     def __init__(self,name,age,sex,course,year,mun,day,fraction,group):#             People.__init__(self,name,age,sex)#             self.course=Course(course)#             self.date=Date(year,mun,day)#             self.fraction=Fraction(fraction)#             self.group=group#     def study(self):#         print('{} is studing'.format(self.name))### t=Teacher('mack',11,'mul','python',1999,12,12,11,3000)# s=Student('jack',22,'mul','python',1988,1,1,100,11)# t.walk()# s.study()# t.course.cour()# s.fraction.frac()

继承有两种用途:一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能。

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。

因为它使得子类与基类出现强耦合。继承的第二种含义非常重要。

它又叫“接口继承”。接口继承实质上是要求“做出一个良好的

抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心

具体细节,可一视同仁的处理实现了特定接口的所有对象”——

这在程序设计上,叫做归一化。归一化使得高层的外部使用者可以

不加区分的处理所有接口兼容的对象集合——就好象linux的泛文

件概念一样,所有东西都可以当文件处理,不必关心它是内存、

磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出

“字符设备”和“块设备”,然后做出针对性的设计:细致到什么

程度,视需求而定)。抽象类

import abcclass File(metaclass=abc.ABCMeta):    @abc.abstractmethod    def read(self):        pass    @abc.abstractmethod    def write(self):        passclass Txt(File):    def read(self):        pass    def write(self):        pass    

```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````