zoukankan      html  css  js  c++  java
  • 继承和组合

    一、组合

    组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合

       也就是说:一个类的属性是另一个类的对象,就是组合

    例子:

      圆环是由两个圆组成的,圆环的面积就是外圆的面积减去内圆的面积。圆环的周长就是内圆的周长加上外圆的周长,这个时候,我们首先设计一个圆形类,计算一个圆的面积和圆的周长。然后在‘圆环类’组合圆形的实例作为自己的属性来用(这样的目的就是为了不用在写面积和周长的方法了,直接组合圆类的面积和方法去求解。减少了代码的重用)

     1 from math import pi
     2 class Circle:
     3     def __init__(self,r):
     4         self.r=r
     5     def perimater(self):
     6         return 2*pi*self.r
     7     def area(self):
     8         return pi*self.r*self.r
     9 # print(Circle.perimater('r',2))
    10 # print(Circle.area('r',3))
    11 
    12 
    13 class Circle_ring: #定义一个圆环类
    14     def __init__(self,outside_r,inside_r):
    15         outside_bijiao = max(outside_r,inside_r)
    16         intside_bijiao = min(outside_r, inside_r)
    17         self.outsize_circle = Circle(outside_bijiao) #实例化一个大圆形  作为self.outside_circle属性的值
    18         self.intsize_circle = Circle(intside_bijiao) #实例化一个小圆环
    19     def area(self):
    20         return self.outsize_circle.area()-self.intsize_circle.area()
    21     def perimater(self):
    22         return self.intsize_circle.perimater()+self.outsize_circle.perimater()
    23 
    24 
    25 r1 = Circle_ring(10,20)  #实例化
    26 print(r1.area())
    27 print(r1.perimater())
    求圆环的面积和周长
    组合的两种方式:1.在__init__方法里面组合
    2.在外面组合
     1 class BirthDate:
     2     def __init__(self,year,month,day):
     3         self.year=year
     4         self.month = month
     5         self.day = day
     6 class Course:
     7     def __init__(self,name,price,period): #period为周期
     8         self.name =name
     9         self.price = price
    10         self.period = period
    11 class Teacher:
    12     def __init__(self,name,salary,year,month,day,price,period): #那么这个里面也要把该有的属性传进去
    13         self.birth = BirthDate(year,month,day) #在里面组合(将BirthDate里面有的属性传入进去)
    14         self.course=Course(name,price,period)
    15         self.name = name
    16         self.salary = salary
    17 # 实例化方法一:
    18 egg = Teacher('egon',2000,1999,12,2,'6 months','15800')  #也要实例化,Teacher类里面的属性都得实例化
    19 print(egg.birth.month)  #当然老师也有生日,就让egg.birth.month
    20 print(egg.course.period)
    21 
    22 # 实例化方法二:
    23 egg.birth=BirthDate(1996,22,4)
    24 print(egg.birth.month)
    在__init__里面组合
     1 class BirthDate:
     2     def __init__(self,year,month,day):
     3         self.year=year
     4         self.month = month
     5         self.day = day
     6 class Course:
     7     def __init__(self,name,price,period): #period为周期
     8         self.name =name
     9         self.price = price
    10         self.period = period
    11 class Teacher:
    12     def __init__(self,name,salary,course):
    13         self.name = name
    14         self.salary = salary
    15         self.course = course
    16 #
    17 # #在外面组合。(组合就是一个类的属性是另一个类的对象)
    18 
    19 egg = Teacher('egon',2000,'python')
    20 egg.birth=BirthDate(1996,22,4) #直接给egg一个birth的属性,
    21 print(egg.birth.year)
    22 
    23 egg.course =Course('python','6 months',15800)
    24 print(egg.course.period)
    在类外面实例化组合

    二、继承

    1.继承是一种创建新类的方式

    2.新建的类可以创建一个或多个父类,父类有称为基类或者超类

    3.新建的类称为派生类或者子类

    在python中类的继承分为:单继承或多继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ParentClass1: #定义父类
        pass
     
    class ParentClass2: #定义父类
        pass
     
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
     
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass

    4.查看所有继承的父类

    print(Person.__bases__)      #__base __只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类

    如果没有指定父类,python会默认继承object类,object是所有python的父类。

    经典类:在python2中,class Dad: 不会继承object,这样的类叫做经典类(它叫经典类,不是因为它经典,而是因为它比较老)

    新式类:在python3中,python会默认继承object类(一切皆对象)

        class Dad  就相当于python2中的  class Dad(object)  #新式类

    而且python3中没有经典类了

    5.继承与抽象(先抽象后继承)

    抽象:抽取类似或者说比较像的部分(也就是提取一类事物的特点,范围越来越大,共性越来越少)

        是从大范围到小范围的过程

    继承:是基于抽象的过程,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构

          是从小范围到大范围的过程

    6.派生:(相对论)

      1.在父类的基础上产生子类,产生的子类就叫做派生类

      2.父类里没有的方法,在子类中有了,这样的方法就叫做派生方法。

      3.父类里有,子类也有的方法,就叫做方法的重写(就是把父类里的方法重写了)

    7.注意的几个概念:

      1.子类可以使用父类的所有属性和方法

      2.如果子类有自己的方法,就执行自己的;如果子类没有自己的方法,就会找父类的。

      3.如果子类里面没有找到,父类里也没有找到,就会报错

      4.如果子类中实现了调用父类的方法

        在类内:super(子类,self).方法名()  supper().__init__(参数)

        在类外:super(子类名,对象名).方法名()

    8.继承的实例

     1 class Animal:      #父类  基类  超类
     2     def __init__(self,name,life_value,aggr):
     3         self.name= name
     4         self.life_value = life_value
     5         self.aggr = aggr  #攻击力
     6     def eat(self):
     7         self.life_value += 10  #谁调谁的血量就增加
     8 
     9 class Person(Animal):  #子类  派生类
    10     def __init__(self, money, name, life_value, aggr):
    11         super().__init__(name, life_value, aggr)
    12         self.money = money  #派生出来的一个属性
    13     def attack(self,enemy):    #人的派生方法
    14         #enemy.life_value = enemy.life_value - self.aggr
    15         enemy.life_value -= self.aggr
    16 
    17 class Dog(Animal): #子类  派生类
    18     def __init__(self,name,breed, life_value,aggr):
    19         # Animal.__init__(self,name,breed, life_value,aggr)#让子类执行父类的方法 就是父类名.方法名(参数),连self都得传
    20         super().__init__(name,life_value,aggr) #super关键字  ,都不用传self了,在新式类里的
    21         # super(Dog,self).__init__(name,life_value,aggr)  #上面super是简写
    22         self.breed = breed
    23     def bite(self,person):   #狗的派生方法
    24         person.life_value -= self.aggr
    25     def eat(self):  #父类方法的重写
    26         super().eat()
    27         print('dog is eating')
    28 
    29 # ha2 = Dog('旺财','哈士奇',20000,100)
    30 # egg = Person('egon',500,1000,50)
    31 # print(egg.aggr)
    32 # print(ha2.aggr)
    33 # egg.eat()
    34 # print(egg.life_value)
    35 #
    36 # egg.eat()
    37 # print(egg.life_value)
    38 #
    39 # ha2.eat()
    40 # print(ha2.life_value)
    41 #
    42 # print(egg.life_value)
    43 # ha2.bite(egg)
    44 # print(egg.life_value)
    45 #
    46 
    47 ha2 = Dog('牛头梗','旺财',20000,100)
    48 print(ha2.life_value)
    49 ha2.eat()  #如果父类有的方法子类里面也有,那么就叫做方法的重写,就不执行父类的了,去执行子类了
    50 print(ha2.life_value)
    51 
    52 
    53 super(Dog,ha2).eat() #生掉父类的方法,但是不推荐这样用
    54 print(ha2.life_value)
    55 
    56 #在继承中,如果子类有的方法就执行子类的
    57 # 如果子类没有的方法就执行父类的
    实现调用父类的方法
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/maaosheng/p/11628222.html
Copyright © 2011-2022 走看看