Cris 的Python笔记(十):面向对象三大特征之继承

版权声明:转载请注明出处~ 摸摸博主狗头 https://blog.csdn.net/cris_zz/article/details/83816653

1、继承的特性

# 通过继承可以使得子类很好的复用父类的代码,减少冗余代码,同时更加符合现实逻辑(编程就是对现实世界的抽象),符合 ocp 原则(open-change-principle)

# object 是一切类的超类,所有对象都是object 的实例
'''
    方法的覆写:和Java 类似,子类可以对父类的方法进行覆写,子类实例调用的时候如果子类覆写则调用子类的方法,否则调用父类的方法(就近原则)
'''

# super:子类继承父类的所有方法(包括魔术方法),不仅可以重写普通方法,还可以重写魔术方法,以__init__方法为例,在子类的方法里通过 super 调用父类的方法


class Animal(object):
    def __init__(self, name):
        self._name = name

    def run(self)->None:
        print('动物在奔跑')

    def eat(self, food: str)->None:
        print('动物在吃:%s' % food)

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name


class Dog(Animal):

    def __init__(self, name, age):
        # 通过super 调用父类的__init__ 方法来初始化父类定义的属性,不需要再传递self 参数
        super().__init__(name)
        self._age = age

    def bar(self):
        print('狗在嚎叫!')

    def run(self):
        print('狗在奔跑~')


d1 = Dog('cris', 11)
d1.run()    # 动物在奔跑/狗在奔跑
d1.eat('狗粮')    # 动物在吃:狗粮
d1.bar()    # 狗在嚎叫!
print(isinstance(d1, Dog))      # True
print(isinstance(d1, Animal))    # True
print(issubclass(Dog, Animal))   # True
print(issubclass(Animal, Dog))   # False

2、Python 的多继承(了解)

# Python支持多继承!(了解)
# 实际开发中应该尽量避免多继承,否则会造成代码的逻辑复杂;多个父类拥有相同的方法,按照继承顺序,前面的父类覆盖后面的父类


class A(object):
    def __init__(self):
        super(A, self).__init__()

    def func_a(self):
        print('A中的方法')


class B(object):

    def __init__(self):
        super(B, self).__init__()

    def func_b(self):
        print("B中的方法")


class C(A, B):

    def __init__(self):
        super(C, self).__init__()


c = C()
c.func_a()  # A中的方法
c.func_b()  # B中的方法
print(C.__bases__)  # (<class '__main__.A'>, <class '__main__.B'>)

猜你喜欢

转载自blog.csdn.net/cris_zz/article/details/83816653