继承的基本概念
在程序中,继承描述的是多个类之间的所属关系
如果一个类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()