一文搞懂Python类和对象!你不懂我不信

喜欢学习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在不同实例中实现的功能也不一样。

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值