继承
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用 继承
。一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为 父类
,而新类称为 子类
。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
继承的概念: 子类拥有父类的所有方法和属性
继承的语法
class 类名(父类名):
pass
子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
子类中应该根据职责,封装子类特有的属性和方法
子类 init 方法
创建子类的实例时,Python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法 __init__()
需要父类施以援手。
例如,下面来模拟 坦克
。 坦克英雄是一种特殊的对象,因此我们可以在前面创建的 Hreo
类的基础上创建新类 Tank
,这样我们就只需为坦克特有的属性和行为编写代码。
class Hero(object):
def __init__(self, name):
self.name = name
...
def hello(self):
print(f'{self.name} 正在向你打招呼')
class TanK(Hero):
def __init__(self, name, defence, blood):
# self.name = name
# 继承了爸爸的方法与属性,同时需要承担相应的责任
super().__init__(name) # super 使用 super 关键字完成继承的仪式
# 在完成仪式的时候,爸爸有的属性儿子需要传递给爸爸
self.defence = defence
self.blood = blood
tank = TanK('坦克', 100, 1000)
# 坦克类没有 hello 方法,但是不会报错
tank.hello()
首先是 Hero
类的代码。创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。
super()
是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Tank
调用父类的方法__init__()
,让 Tiger
实例包含父类的所有属性。父类也称为 超类
(superclass),名称 super 因此而得名。
为测试继承是否能够正确地发挥作用,我们尝试创建一个坦克对象,但提供的信息与创建英雄时相同。结果正常运行。
tank = Tank('坦克', 100, 1000)
tank.hello()
继承演示
实现以下内容的封装
"""
定义动物类(Animal)一个动物类
属性:name、high、weight
方法:eat
定义老虎类(Tiger)
属性:name、high、weight
方法:eat、bark、tiger_skill
定义狮子类(Lion)
属性:name、high、weight
方法:eat、bark、lion_skill
"""
无继承
class Animal(object):
def __init__(self, name, high, weight):
self.name = name
self.high = high
self.weight = weight
def eat(self):
print(f'{self.name} 正在吃东西')
class Tiger(object):
def __init__(self, name, high, weight):
self.name = name
self.high = high
self.weight = weight
def eat(self):
print(f'{self.name} 正在吃东西')
def bark(self):
print(f'{self.name} 正在嗷呜叫~~~')
def tiger_skill(self):
print(f'来自丛林之王 {self.name} 必杀技')
class Lion(object):
def __init__(self, name, high, weight):
self.name = name
self.high = high
self.weight = weight
def eat(self):
print(f'{self.name} 正在吃东西')
def bark(self):
print(f'{self.name} 正在吼吼叫~~~')
def lion_skill(self):
print(f'来自草原之王 {self.name} 必杀技')
有继承
class Animal(object):
def __init__(self, name, high, weight):
self.name = name
self.high = high
self.weight = weight
# 动物默认吃东西的声音
def eat(self):
print(f'{self.name} 正在吃东西')
class Tiger(Animal):
def __init__(self, name, high, weight):
# 相当于调用了父类的初始化放在,在父类的init方法中绑定 name, high, weight
super().__init__(name, high, weight)
# def eat(self):
# print(f'{self.name} 正在吃东西')
def bark(self):
print(f'{self.name} 正在嗷呜叫~~~')
def tiger_skill(self):
print(f'来自丛林之王 {self.name} 必杀技')
class Lion(Animal):
def __init__(self, name, high, weight):
super().__init__(name, high, weight)
# def eat(self):
# print(f'{self.name} 正在吃东西')
def bark(self):
print(f'{self.name} 正在吼吼叫~~~')
def lion_skill(self):
print(f'来自草原之王 {self.name} 必杀技')
tiger = Tiger('泰哥', 1.88, 360)
lion = Lion('辛巴', 2, 380)
tiger.eat()
# lion --> Lion 类 --> Animal 类 --> object 类 还是没有就会报错
lion.eat()
tiger.tiger_skill()
lion.lion_skill()
tiger.bark()
lion.bark()
子类新增属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。
新增一个猫类,并且猫咪会多出一个颜色属性。
class Cat(Animal):
def __init__(self, name, high, weight):
super().__init__(name, high, weight)
self.color = '银白色'
def eat(self):
print(self.name, '正在吃东西')
def bark(self):
print(self.name, '正在喵喵叫')
def skill(self):
print(self.name, '猫咪的必杀技')
def info(self):
print(f'种类:猫\t名字:{self.name}\t颜色:{self.color}\t体重:{self.weight}')
t = Cat('小猫咪', 1.9, 320)
t.eat()
t.info()
在心的类里面,我们添加了新属性 self.color
,并设置其初始值(如黄色
)。根据 Cat
类创建的所有实例都将包含这个属性,但所有 Animal
实例都不包含它。
我们还添加了一个名为 info()
的方法,它打印有猫咪的信息。我们调用这个方法时,将看到一条猫咪类特有的描述。
案例-动物类继承
"""
小蛇修炼记
蛇 --> 蛟 --> 龙
蛇 snake
属性:
name
color(颜色)
length(长度)
size(粗细)
行为:
run(游走)
蛟 Jiao
属性:
name
color(颜色)
length(长度)
size(粗细)
claw(爪子)
corner(角)
行为:run(游走),fly(飞行)
龙 Dragon
属性:
name
color(颜色)
length(长度)
size(粗细)
claw(爪子)
corner(角)
行为:
run(游走)
fly(飞行)
skill(技能)
"""
class Snake(object):
def __init__(self, name, color, length, size):
self.name = name
self.color = color
self.length = length
self.size = size
def run(self):
return f'{self.name} 正在跑路....'
# alt + shift + 鼠标左键
# ctrl + shift + ->
class Jiao(Snake):
def __init__(self, name, color, length, size, claw, corner):
super(Jiao, self).__init__(name, color, length, size)
self.claw = claw
self.corner = corner
def fly(self):
return f'{self.name} 正在腾云驾雾'
class Dragon(Jiao):
def skill(self):
return f'{self.name} 正在施云布雨'
snake = Snake('小花蛇', '斑纹', '50 cm', '5 cm')
print(snake.run())
jiao = Jiao('小花蛟', '斑纹', '250 cm', '50 cm', 2, 1)
print(jiao.fly())
long = Dragon('小金龙', '金色', '2500 cm', '250 cm', 5, 2)
print(long.skill())