022_继承_派生_多继承_砖石继承

1,什么是继承python

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

2,python中类的继承分为:单继承和多继承函数

  2.1,定义类时,类名后面的括号是用来代表关系的,不是用来传参的。spa

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

  2.2,查看继承code

>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看全部继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
>>>ParentClass1.__bases__
(<class 'object'>,)	#任何一个没有父类的类都是object的子类。python3中没有继承的默认继承object类。

3,在定义类时,在默认执行__init__(self)以前,就会默认创建了一个空白对象self。对象

  在当前的代码中,建立dog对象时,经过Dog类建立,此时已经建立了Dog的空白对象self,在默认执行__init__(self)时,本身并无,就会执行父类里的,所以,传给父类的__init__(self)方法的对象是Dog的空白对象self。因此,执行里面的self.func()时,应该是Dog的func()
class Animal:
    def __init__(self):
        print('执行Animal.__init__')
        self.func()
 
class Dog(Animal):
    def func(self):
        print('Dog.func')
 
dog = Dog()
# 结果
# 执行Animal.__init__
# Dog.func

4,继承blog

  在开发程序的过程当中,若是咱们定义了一个类A,而后又想新创建另一个类B,可是类B的大部份内容与类A的相同时
  咱们不可能从头开始写一个类B,这就用到了类的继承的概念。
  经过继承的方式新建类B,让B继承A,B会‘遗传’A的全部属性(数据属性和函数属性),实现代码重用继承

class Animal:
    '''
    人和狗都是动物,因此创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有本身的昵称;
        self.aggressivity = aggressivity  # 人和狗都有本身的攻击力;
        self.life_value = life_value  # 人和狗都有本身的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()

5,supperci

  在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能须要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,所以即使是self参数也要为其传值.
  在python3中,子类执行父类的方法也能够直接用super方法 
class A:
    def hahaha(self):
        print('A')

class B(A):
    def hahaha(self):
        super().hahaha() # “supper(类名,对象名).方法名” #super(B,self).hahaha(),
						# 在本类中参数能够不写,默认传本类的类名和对象。 此方法也可用于类外。
        # A.hahaha(self) # 用调用普通函数的方式(同上句)
        print('B')

a = A()
b = B()
b.hahaha()
super(B,b).hahaha()

6,派生开发

class Animal:
    '''
    人和狗都是动物,因此创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有本身的昵称;
        self.aggressivity = aggressivity  # 人和狗都有本身的攻击力;
        self.life_value = life_value  # 人和狗都有本身的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    '''
    狗类,继承Animal类
    '''
    def __init__(self,name,breed,aggressivity,life_value):
        super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
        self.breed = breed  #派生出了新的属性

    def bite(self, people):
        '''
        派生出了新的技能:狗有咬人的技能
        :param people:  
        '''
        people.life_value -= self.aggressivity

    def eat(self):
        # Animal.eat(self)
        #super().eat()
        print('from Dog')

class Person(Animal):
    '''
    人类,继承Animal
    '''
    def __init__(self,name,aggressivity, life_value,money):
        #Animal.__init__(self, name, aggressivity, life_value)
        #super(Person, self).__init__(name, aggressivity, life_value)
        super().__init__(name,aggressivity, life_value)  #执行父类的init方法
        self.money = money   #派生出了新的属性

    def attack(self, dog):
        '''
        派生出了新的技能:人有攻击的技能
        :param dog: 
        '''
        dog.life_value -= self.aggressivity

    def eat(self):
        #super().eat()
        Animal.eat(self)    #若是既想实现新的功能也想使用父类本来的功能,还须要在子类中再调用父类
        print('from Person')

egg = Person('egon',10,1000,600)
ha2 = Dog('二愣子','哈士奇',10,1000)
print(egg.name)
print(ha2.name)
egg.eat()

7,继承顺序

8,多继承中的砖石继承

# 父类中没有的属性 在子类中出现 叫作派生属性
# 父类中没有的方法 在子类中出现 叫作派生方法
# 只要是子类的对象调用,子类中有的名字 必定用子类的,子类中没有才找父类的,若是父类也没有报错
# 若是父类 子类都有 用子类的
    # 若是还想用父类的,单独调用父类的:
    #       父类名.方法名 须要本身传self参数
    #       super().方法名 不须要本身传self
# 正常的代码中 单继承 === 减小了代码的重复
# 继承表达的是一种 子类是父类的关系
9,面向对象的的组合
  9.1,什么是组合
<1>软件重用的重要方式除了继承以外还有另一种方式,即:组合
<2>组合指的是,在一个类中以另一个类的对象做为数据属性,称为类的组合
<3>当类之间有显著不一样,而且较小的类是较大的类所须要的组件时,用组合比较好
class Weapon:
    def prick(self, obj):  # 这是该装备的主动技能,扎死对方
        obj.life_value -= 500  # 假设攻击力是500

class Person:  # 定义一我的类
    role = 'person'  # 人的角色属性都是人

    def __init__(self, name):
        self.name = name  # 每个角色都有本身的昵称;
        self.weapon = Weapon()  # 给角色绑定一个武器;
        
egg = Person('egon')
egg.weapon.prick() 
#egg组合了一个武器的对象,能够直接egg.weapon来使用组合类中的全部方法

  9.2,圆环计算组合

  圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。

  这个时候,咱们就首先实现一个圆形类,计算一个圆的周长和面积。而后在"环形类"中组合圆形的实例做为本身的属性来用

from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 '''
    def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle =  Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长

class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 '''
    def __init__(self,radius_outside,radius_inside): self.outsid_circle = Circle(radius_outside) self.inside_circle = Circle(radius_inside) def area(self): return self.outsid_circle.area() - self.inside_circle.area() def perimeter(self): return  self.outsid_circle.perimeter() + self.inside_circle.perimeter() ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积
圆环加计算

  9.3,能够先实例化在传给属性

    用组合的方式创建了类与组合的类之间的关系,它是一种‘有’的关系,好比教授有生日,教授教python课程

class BirthDate: def __init__(self,year,month,day): self.year=year self.month=month self.day=day class Couse: def __init__(self,name,price,period): self.name=name self.price=price self.period=period class Teacher: def __init__(self,name,gender,birth,course): self.name=name self.gender=gender self.birth=birth self.course=course def teach(self): print('teaching') p1=Teacher('egon','male', BirthDate('1995','1','27'), Couse('python','28000','4 months') ) print(p1.birth.year,p1.birth.month,p1.birth.day) print(p1.course.name,p1.course.price,p1.course.period) ''' 运行结果: 1 27 python 28000 4 months '''
先实例化在传给属性
相关文章
相关标签/搜索