面向对象之继承

 

1、继承的好处

# 节省代码
# 提高效率
# 让类之间产生关联。
示例:
class Animal:
    def __init__(self, kind, age, sex):
        self.kind = kind
        self.age = age
        self.sex = sex

class Person(Animal):
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

p1 = Person('黄色人种', 25, '')
print(p1.__dict__)

 

 

2、继承的分类

如上:

# Animal 父类,基类
# Person 子类,派生类
# 继承:单继承,多继承。

# 类:经典类,新式类
    # 经典类:不继承object的类。
    # 新式类: 继承object的类。
    # python2x 经典类 新式类(object) 共存。#了解 新式类需要在类名后面加上(object)
# python3x 默认继承object 全部都是新式类。
区别在于:多继承的时候,查询的顺序不同。新式类比经典类查询效率要高。
class A:
  pass
a1 =A()
会报错吗?我这个对象必须要找到__init__方法。
答案是不报错。这个是因为python3用的都是新式类。其实所有类都继承object类。点击去object类找到__init__方法。

2.1 单继承

class Animal:
    a1 = '太白'
    def __init__(self, kind, age, sex):
        self.kind = kind
        self.age = age
        self.sex = sex

    def func1(self):
        print(666)

class Person(Animal):
    # a1 = 'alex'
    pass

# 类名
print(Person.a1)
# Person.func1(123) 一般类名不调用方法
需求:子类有自己的属性,我如何既要执行父类的属性或方法,又要执行子类或方法。
class Animal:

    def __init__(self, kind, age, sex):
        self.kind = kind
        self.age = age
        self.sex = sex

    def bark(self):
        print('动物都会叫')
class Dog(Animal):   #Animal去掉也能执行。 
    def __init__(self, k1,a1,s1,bite):
        '''
        self = d1
        k1 = '藏獒'
        ....
        '''
        # Animal.__init__(self, k1, a1, s1)  #第一种: Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法

     super().__init__(k1,a1,s1) #第二种:自动将self传给父类的self,不用你自己传了 self.bite
= bite def bark(self): print('汪汪汪') class Cat(Animal): def bark(self): print('喵喵喵') class chick(Animal): def bark(self): print('大爷,来玩呀') d1 = Dog('藏獒', 3, '', 300) print(d1.__dict__)

 

两种解决方式解决既要执行子类的方法,又要执行父类的方法
第一种 Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法
第二种:super().__init__(k1,a1,s1) # 自动将self传给父类的self




d1.bark()

先执行父类,在执行子类。

 

发现都执行了。

完整版:

 

#需求:子类有自己的属性,我如何既要执行父类的属性或方法,又要执行子类或方法。
class Animal:
    def __init__(self,kind,age,sex):
        self.kind = kind
        self.age = age
        self.sex = sex

    def bark(self):
        print('动物都会叫')

class Dog(Animal):
    def __init__(self,k1,a1,s1,bite2):
        # Animal.__init__(self,k1,a1,s1)
        super().__init__(k1,a1,s1)
        self.bite = bite2   #增加咬合力的属性

    def bark(self):
        super().bark()
        print('汪汪汪')

class Cat(Animal):
    def __init__(self,k1,a1,s1,bite):
        # Animal.__init__(self,k1,a1,s1)   #第一种: Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法
        super().__init__(k1,a1,s1)         #第二种:自动将self传给父类的self,不用你自己传了
        self.bite = bite  #增加咬合力的属性

    def bark(self):
        super().bark()
        print('喵喵喵')

class chick(Animal):
    def __init__(self,k1,a1,s1,bite3):
        Animal.__init__(self,k1,a1,s1)
        self.bite = bite3   #增加咬合力的属性

    def bark(self):
        super().bark()
        print('大爷,来玩呀')

d1 = Dog('藏獒',3,'公',300)
print(d1.__dict__)
d1.bark()

c1 = Cat('咪咪',2,'母',50)
print(c1.__dict__)
c1.bark()
c2 = chick('公鸡',1,'公',20)
print(c2.__dict__)
c2.bark()

  

 

 

 

 

 

2.2、多继承

# 新式类:C3算法 mro 主要是查询 新式类的多继承的继承顺顺序
通过mro查看继承顺序
class A:
    def func(self):
        print(666)
    pass

class B:
    def func(self):
        print(666)
    pass

class C(A):
    def func(self):
        print(666)
    pass

class D(B):
    def func(self):
        print(666)
    pass

class E(C,D):
    # def func(self):
    #     print(666)
    pass
#
e1 = E()
e1.func()

print(E.mro())

 

 

 

 

 

 

单继承其他示例:

# 单继承

class A:
    name = 'alex'
    def func(self):
        print('IN A')

class B(A):

    name = '太白'

    def func(self):
        # self = obj
        A.func(self)       #IN A
        # print('IN b')
        super().func()    #IN A

obj = B()
# obj.name
obj.func()

 

 

 

posted @ 2018-11-13 03:31  小菜鸟111  阅读(266)  评论(0编辑  收藏  举报