喜欢学习Python的小朋友们,你们好呀!
为什么Python叫做面向对象编程的语言呢?万物都可以看作一个对象,一个对象既有属性,又有行为。比如,一个学生可以是一个对象,学生的属性包括姓名、年龄、所属班级等等,行为可以有写作业、睡觉、玩游戏等等。我们用定义的类来创建对象,对象有属性和行为,那么类就对应有成员变量和成员方法,成员方法本质上就是函数。定义好类之后,就可以创建类的对象,来解决各种各样的问题。
漫威宇宙里有这么多的英雄,如果每个英雄都要单独描述一遍,那工作量也太大了,所以我们可以先定义一个类来代表所有的英雄:
class Marvel:
def __init__(self, name, power):
self.name = name
self.power = power
def show_info(self):
"""展示角色信息"""
print(f"我是{self.name},我的能力是:{self.power}")
def attack(self):
"""基类的通用攻击方法"""
print(f"{self.name}正在进行攻击!")
我们用class定义了Marvel(漫威)这个类,其中__init__(self,...)是类的构造函数,定义任何一个类都需要定义构造函数,当我们在用类创建对象的时候,Python会自动调用__init__()并执行,这个函数的作用是接收对象的实参的值。Marvel里有英雄的名字(name)和能力(power)这两个成员变量,有show_info(展示角色信息)和attack(攻击方法)这两个成员方法。所有的漫威英雄都具有这些属性和行为。
之后我们定义两个具体英雄的类:
class Marvel():
def __init__(self, name, power):
self.name = name
self.power = power
def show_info(self):
"""展示角色信息"""
print(f"我是{self.name},我的能力是:{self.power}")
def attack(self):
"""基类的通用攻击方法"""
print(f"{self.name}正在进行攻击!")
# 定义子类——钢铁侠
class IronMan(Marvel):
def __init__(self, name, power):
super().__init__(name,power)
# 定义子类——美队
class CaptainAmerica(Marvel):
def __init__(self, name, power):
super().__init__(name,power)
ironman = IronMan('钢铁侠','发射掌心炮')
ironman.show_info()
ironman.attack()
print('\n')
captain = CaptainAmerica('美国队长','投掷盾牌')
captain.show_info()
captain.attack()
钢铁侠和美国队长这两个类都继承了Marvel这个类,拥有Marvel全部的属性和行为。值得一提的是,在子类的__init__()函数里,还是要写父类Marvel的成员变量,并且要写super().__init__(父类属性),只有写上了super()函数,子类才能完全继承父类的属性和行为。
然后我们在下面定义了对象ironman,在用类定义对象时要写上实参,这样才能通过__init__()函数将实参的值赋给类的成员变量。
结果:
class Marvel():
def __init__(self, name, power):
self.name = name
self.power = power
def show_info(self):
"""展示角色信息"""
print(f"我是{self.name},我的能力是:{self.power}")
def attack(self):
"""基类的通用攻击方法"""
print(f"{self.name}正在进行攻击!")
class IronMan(Marvel):
def __init__(self, name, power, armor):
super().__init__(name, power) # 调用父类的构造函数
self.armor = armor # 钢铁侠特有的属性
def show_info(self):
"""重写父类的方法"""
super().show_info()
print(f"钢铁侠盔甲型号是:{self.armor}")
def attack(self):
"""子类的攻击方式"""
print(f"{self.name}发射了激光束!")
# 定义子类——美国队长
class CaptainAmerica(Marvel):
def __init__(self, name, power, shield):
super().__init__(name, power)
self.shield = shield # 美国队长特有的属性
def show_info(self):
"""重写父类的方法"""
super().show_info()
print(f"美队盾牌是:{self.shield}")
def attack(self):
"""子类的攻击方式"""
print(f"{self.name}掷出了振金盾!")
# 创建子类实例
iron_man = IronMan("钢铁侠", "高科技武装", "Mark-85")
captain_america = CaptainAmerica("美国队长", "超凡体能", "振金盾牌")
# 调用方法展示继承和多态
iron_man.show_info()
iron_man.attack()
print('\n')
captain_america.show_info()
captain_america.attack()
print('\n')
# 多态
heroes = [iron_man, captain_america]
for hero in heroes:
hero.attack() # 调用子类的重写方法
我们在原来的基础上,加入了方法的复写和多态,复写指子类在继承了父类的方法后,还可以改变方法的功能,多态指相同的方法在不同类实例的不同实现。子类IronMan和CaptainAmerica都拥有show_info和attack方法,但通过复写使得具体的内容不一样。同一个行为attack在不同实例中实现的功能也不一样。
结果: