面向对象之继承

 

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()

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

发现都执行了。

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)
        # print('IN b')
        super().func()   

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

 

原文地址:https://www.cnblogs.com/wangkaiok/p/9950170.html