继承的基本概念

在程序中,继承描述的是多个类之间的所属关系

如果一个类A里面的属性方法可以妇幼,则可以通过继承的方式,传递到类B里。

那么类A就是基类,也叫父类;类B就是派生类,也叫子类

# 继承:描述类与类之间的关系
# 基本语法:class 类B(类A):

# 称为类 B 继承类 A
# 特点 B类的对象可以使用A类中的属性和方法
# 优点:提高代码的复用性
# 名词:
# 类A:父类、基类
# 类B:子类、派生类

# 1. 定义一个 动物类 Animal 类
class Animal(object):
    # 2. 在animal 类书写 play 方法 用于描述动物的玩耍行为
    def play(self):
        print("快乐的玩耍....")


# 3. 定义一个 Dog 类 继承 Animal 类
class Dog(Animal):
    pass

# 4. 创建一个Dog对象.调用父类的方法
dog = Dog()
dog.play()



"""
    单继承:如果一个类只有一个父类,把这种继承关系称为单继承
    多继承:如果一个类有多个父类,把这种继承关系称为多继承
    多层继承:如果一个类有多个父类,并且这些父类又有父类,把这种继承关系称为多层继承
"""
# 1. 定义一个 动物类 Animal 类
class Animal(object):  # 对于Animal类和object类来说,单继承
    # 2. 在animal 类书写 play 方法 用于描述动物的玩耍行为
    def play(self):
        print("快乐的玩耍....")


# 3. 定义一个 Dog 类 继承 Animal 类
class Dog(Animal):  # Dog ---> Animal 也是单继承, Dog ---> Animal ---> object 这种继承关系称为多层继承
    def bark(self):
        print("汪汪叫....")


#  4.定义类 XTQ类 继承 Dog 类
# 多层继承中,子类可以使用所有继承链上的属性和方法
class XTQ(Dog):  # XTQ ---> Dog ---> Animal ---> object 这种继承关系称为多层继承
    def fly(self):
        print("飞飞飞....")


# 创建一个 XTQ 对象
xtq = XTQ()
xtq.fly()
xtq.bark()
xtq.play()

子类重写父类的同名方法

# 子类重写父类的同名方法
# 子类继承父类的方法,但是子类的方法和父类的方法不一样,子类可以重写父类的方法
class Animal(object):
    def run(self):
        print('动物会跑')


class Dog(Animal):
    # 重写父类的方法
    def run(self):
        print('狗会跑')

    def bark(self):
        print('狗会叫')


class Cat(Animal):
    # 重写父类的方法
    def run(self):
        print('猫会跑')

    def catch(self):
        print('猫会抓老鼠')


# 创建对象
dog = Dog()
# 调用方法
dog.run()
dog.bark()
# 创建对象
cat = Cat()
# 调用方法
cat.run()
cat.catch()

子类调用父类中的同名方法

# 子类调用父类中的同名方法
class Animal(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f'{self.name}正在吃')


class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)

    def eat(self):
        print(f'{self.name}正在啃骨头')
        # 调用父类中的方法
        super().eat()  # 第一种方式
        Animal.eat(self)  # 第二种方式 为什么要传self呢? 因为在调用父类方法的时候,需要传递self参数 传递的是当前对象 self是当前对象的引用



dog = Dog('旺财')
dog.eat()
# 旺财正在啃骨头
# 旺财正在吃

继承中的init

# 继承中的init方法
class Animal:
    def __init__(self, name):
        self.name = name

    def run(self):
        print(f'{self.name} is running')


class Dog(Animal):
    def __init__(self, name, age):
        # 调用父类的init方法
        super().__init__(name)
        self.age = age

    def bark(self):
        print(f'{self.name} is barking at you! Woof! Woof! Woof! {self.age} years old!')


dog = Dog('Tom', 2)
dog.run()
dog.bark()

多继承

如果一个类有两个及以上,就把这种继承称之为多继承

# 多继承

# 定义一个Dog类,定义bark方法 和 eat方法
class Dog(object):
    def bark(self):
        print('汪汪叫')

    def eat(self):
        print('吃东西')


# 定义一个God类,定义fly方法 和 eat方法
class God:
    def fly(self):
        print('飞')

    def eat(self):
        print('吃蟠桃')


# 定义一个Person类,继承Dog类和God类
class Person(Dog, God):
    pass


# 创建一个Person对象
p = Person()
p.bark()
p.fly()

# 如果继承的两个父类中有同名的方法,调用的时候,会调用第一个继承的父类的方法
p.eat()

多继承中指定父类中的方法

# 定义一个Dog类,定义bark方法 和 eat方法
class Dog(object):
    def bark(self):
        print('汪汪叫')

    def eat(self):
        print('吃东西')


# 定义一个God类,定义fly方法 和 eat方法
class God(object):
    def fly(self):
        print('飞')

    def eat(self):
        print('吃蟠桃')


# 定义一个Person类,继承Dog类和God类
class Person(Dog, God):
    def eat(self):
        print('子类重写eat方法,调用子类自己的方法')
        # 调用指定父类中的方法
        # Dog.eat(self)
        # God.eat(self)
        # 方法二 super(类A, self).方法名() 类A是当前类的父类(继承顺序链中的下一个类)中的方法
        super(Dog, self).eat()
        # super(God, self).eat()  # 会报错,因为God类在Dog类的后边,所以不能调用 'super' object has no attribute 'eat'



# 创建一个Person对象
p = Person()
p.bark()
p.fly()

# 如果继承的两个父类中有同名的方法,调用的时候,会调用第一个继承的父类的方法
p.eat()

私有属性和私有方法

# 私有属性和私有方法
# 私有属性:属性前面加两个下划线 __属性名
# 私有方法:方法前面加两个下划线 __方法名
class Student(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def __show(self):
        print("姓名:%s,年龄:%s" % (self.__name, self.__age))

    def show(self):
        self.__show()

    def get_name(self):
        return self.__name

    def get_age(self):
        return self.__age

    def set_name(self, name):
        self.__name = name

    def set_age(self, age):
        self.__age = age


stu = Student("Tom", 20)
stu.show()

results matching ""

    No results matching ""