当前位置: 首页 > news >正文

2025-05-29 学习记录--Python-面向对象

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、面向对象 ⭐️

(一)类和实例 🍭

1、类的定义 🍉

类的定义: 🦋

  • class:表明这是一个类。
  • ClassName:类的名字。
  • ():父类集合的开始和结束。
  • object:父类的名字,定义的类继承自父类,可以不写,默认是object。object是所有类的直接或间接父类。
class ClassName(object):<statement-1>...<statement-N>
2、类的实例化(创建对象) 🍉

实例名 = 类() 的方式实例化对象,为类创建一个实例

举例: 🌰

# 定义一个名为 Player 的类,继承自基类 object(Python 中所有类的默认基类)
class Player(object):  # object 基类pass  # 使用 pass 表示这是一个空类,暂无属性和方法定义# 创建 Player 类的实例(对象),命名为 tom
tom = Player()  # 类的实例化(创建对象)# 打印 tom 对象的类型(输出其所属的类)
print(type(tom))  # 输出:<class '__main__.Player'># 检查 tom 是否是 Player 类的实例,返回布尔值(True/False)
print(isinstance(tom, Player))  # 输出:True# 检查 tom 是否是 object 类的实例(因为所有类都继承自 object)
print(isinstance(tom, object))  # 输出:True

输出结果: 👇🏻

<class '__main__.Player'>
True
True
3、实例(对象)属性 🍉

Python中,实例(Instance)就是对象(Object)。

举例: 🌰

# 定义一个名为Player的类,继承自object基类(Python3中所有类默认继承object,可省略)
class Player(object):# 定义初始化方法(构造函数),在创建对象时自动调用# 参数说明:self指实例本身,name/age/city是创建对象时必须传入的参数def __init__(self, name, age, city):  # 初始化函数(构造函数)# 将传入的参数赋值给实例属性self.name = name  # 创建name属性并赋值self.age = age    # 创建age属性并赋值self.city = city  # 创建city属性并赋值# 创建Player类的实例mia,传入初始化参数
mia = Player('mia', 18, '上海')  # 实例化对象,name='mia', age=18, city='上海'# 修改mia实例的city属性
mia.city = '重庆'  # 将city属性从'上海'改为'重庆'# 打印mia实例的name、age和city属性
print(mia.name, mia.age, mia.city)  # 输出:mia 18 重庆# 创建另一个Player类的实例tom
tom = Player('tom', 19, '成都')  # 实例化对象,name='tom', age=19, city='成都'# 打印tom实例的name、age和city属性
print(tom.name, tom.age, tom.city)  # 输出:tom 19 成都# 给tom实例动态添加height属性(Python允许给实例动态添加新属性)
tom.height = 180  # 添加height属性并赋值为180# 打印tom实例的所有属性和值(以字典形式返回)
print(tom.__dict__)  # 输出:{'name': 'tom', 'age': 19, 'city': '成都', 'height': 180}

输出结果: 👇🏻

mia 18 重庆
tom 19 成都
{'name': 'tom', 'age': 19, 'city': '成都', 'height': 180}
4、类属性 🍉

举例: 🌰

# 定义一个名为Player的类,继承自object基类
class Player(object):# 类属性(所有实例共享)numbers = 0  # 类属性(一般用于统计或共享)def __init__(self, name, age, city):  # 初始化函数(构造函数)# 实例属性(每个实例独有的属性)self.name = name  # 实例属性:玩家姓名self.age = age    # 实例属性:玩家年龄self.city = city  # 实例属性:玩家城市# 每创建一个实例,类属性numbers加1Player.numbers += 1  # 修改类属性,统计玩家数量# 创建第一个Player实例mia
mia = Player('mia', 18, '上海')  # 实例化,触发__init__方法# 打印mia实例的所有实例属性(以字典形式)
print(mia.__dict__)  # 输出:{'name': 'mia', 'age': 18, 'city': '上海'}# 打印当前玩家数量(通过类属性访问)
print('欢迎第 %d 个玩家注册!' % Player.numbers)  # 输出:欢迎第 1 个玩家注册!# 创建第二个Player实例tom
tom = Player('tom', 19, '成都')  # 实例化,触发__init__方法# 打印tom实例的所有实例属性
print(tom.__dict__)  # 输出:{'name': 'tom', 'age': 19, 'city': '成都'}# 再次打印当前玩家数量(此时已增加为2)
print('欢迎第 %d 个玩家注册!' % Player.numbers)  # 输出:欢迎第 2 个玩家注册!

输出结果: 👇🏻

{'name': 'mia', 'age': 18, 'city': '上海'}
欢迎第 1 个玩家注册!
{'name': 'tom', 'age': 19, 'city': '成都'}
欢迎第 2 个玩家注册!

(二)实例(对象)方法 🍭

举例: 🌰

# 定义一个Player类,继承自object基类(Python3中可省略)
class Player(object):# 类属性(所有实例共享)numbers = 0  # 用于统计玩家总数levels = ['青铜','白银','黄金','钻石','王者']  # 所有可能的段位等级def __init__(self, name, age, city, level):  # 初始化方法(构造函数)# 实例属性(每个玩家独有的属性)self.name = name  # 玩家姓名self.age = age    # 玩家年龄self.city = city  # 玩家所在城市# 验证传入的段位是否合法if level not in Player.levels:raise Exception('段位设置错误!')  # 如果段位不在预设列表中,抛出异常else:self.level = level  # 如果合法,设置玩家段位Player.numbers += 1  # 每创建一个玩家实例,总数加1def show(self):  # 实例方法:显示玩家信息# 格式化输出玩家信息print('我是第 %d 个玩家,我的名字是 %s,%d 岁,我来自 %s,我的段位是 %s' % (Player.numbers, self.name, self.age, self.city, self.level))def level_up(self):  # 实例方法:段位升级index1 = Player.levels.index(self.level)  # 获取当前段位的索引if index1 < len(Player.levels) - 1:  # 如果不是最高段位self.level = Player.levels[index1 + 1]  # 升级到下一个段位# 创建一个Player实例mia
mia = Player('mia',18,'成都','钻石')  # 实例化一个钻石段位的玩家# 调用show方法显示mia的信息
mia.show()  # 输出:我是第1个玩家...# 调用level_up方法让mia升级段位
mia.level_up()  # 钻石→王者# 再次显示mia的信息(段位已升级)
mia.show()  # 输出:我是第1个玩家...段位是王者

输出结果: 👇🏻

我是第 1 个玩家,我的名字是 mia,18 岁,我来自 成都,我的段位是 钻石
我是第 1 个玩家,我的名字是 mia,18 岁,我来自 成都,我的段位是 王者

(三)类方法 🍭

举例: 🌰

# 定义一个Player类,继承自object基类(Python3中可省略)
class Player(object):# 类属性(所有实例共享)numbers = 0  # 用于统计玩家总数levels = ['青铜', '白银', '黄金', '钻石', '王者']  # 所有可能的段位等级def __init__(self, name, age, city, level):  # 初始化方法(构造函数)# 实例属性(每个玩家独有的属性)self.name = name  # 玩家姓名self.age = age  # 玩家年龄self.city = city  # 玩家所在城市# 验证传入的段位是否合法if level not in Player.levels:raise Exception('段位设置错误!')  # 如果段位不在预设列表中,抛出异常else:self.level = level  # 如果合法,设置玩家段位Player.numbers += 1  # 每创建一个玩家实例,总数加1def show(self):  # 实例方法:显示玩家信息# 格式化输出玩家信息print('我是第 %d 个玩家,我的名字是 %s,%d 岁,我来自 %s,我的段位是 %s' %(Player.numbers, self.name, self.age, self.city, self.level))@classmethod  # 装饰器,声明这是一个类方法def get_players(cls):  # 类方法# cls参数会自动传入当前类(这里是Player)print('用户数量已经达到了 %d 人' % cls.numbers)  # 访问类属性numbers# 创建一个Player实例mia
mia = Player('mia', 18, '上海','青铜')  # 实例化一个青铜段位的玩家# 调用实例方法show()显示mia的信息
mia.show()  # 输出:我是第1个玩家...# 调用类方法get_players()显示当前玩家总数
Player.get_players()  # 输出:用户数量已经达到了1人

输出结果: 👇🏻

我是第 1 个玩家,我的名字是 mia,18 岁,我来自 上海,我的段位是 青铜
用户数量已经达到了 1

(四)静态方法 🍭

举例: 🌰

# 定义一个Player类,继承自object基类(Python3中可省略)
class Player(object):# 类属性(所有实例共享)numbers = 0  # 用于统计玩家总数levels = ['青铜', '白银', '黄金', '钻石', '王者']  # 所有可能的段位等级def __init__(self, name, age, city, level):  # 初始化方法(构造函数)# 实例属性(每个玩家独有的属性)self.name = name  # 玩家姓名self.age = age  # 玩家年龄self.city = city  # 玩家所在城市# 验证传入的段位是否合法if level not in Player.levels:raise Exception('段位设置错误!')  # 如果段位不在预设列表中,抛出异常else:self.level = level  # 如果合法,设置玩家段位Player.numbers += 1  # 每创建一个玩家实例,总数加1def show(self):  # 实例方法:显示玩家信息# 格式化输出玩家信息print('我是第 %d 个玩家,我的名字是 %s,%d 岁,我来自 %s,我的段位是 %s' %(Player.numbers, self.name, self.age, self.city, self.level))@classmethod  # 装饰器,声明这是一个类方法def get_players(cls):  # 类方法# cls参数会自动传入当前类(这里是Player)print('用户数量已经达到了 %d 人' % cls.numbers)  # 访问类属性numbers@staticmethod  # 装饰器,声明这是一个静态方法def isvalid(**kwargs):  # 静态方法:验证玩家信息是否有效# 检查年龄是否大于18岁if kwargs['age'] > 18:  # 如果年龄大于18return True  # 返回验证通过else:return False  # 返回验证不通过# 创建玩家信息字典
infos = {'name':'mia','age':12,'city':'北京','level':'白银'}# 使用静态方法验证玩家信息
if Player.isvalid(**infos):  # 如果验证通过(这里age=12会返回False)mia = Player('mia',24,'北京','白银')  # 创建玩家实例
else:print('请检查')  # 输出提示信息(实际会执行这行)

输出结果: 👇🏻

请检查

(五)面向对象的三大特征 🍭

1、继承 🍓

举例: 🌰

class Character:  # 父类:游戏角色基类def __init__(self, name, hp):self.name = nameself.hp = hp  # 生命值def attack(self):print(f"{self.name} 发动了普通攻击!")class Warrior(Character):  # 子类:战士(继承Character)def __init__(self, name, hp, strength):super().__init__(name, hp)  # 调用父类的初始化方法self.strength = strength  # 新增属性:力量# 重写父类方法def attack(self):print(f"{self.name} 用剑造成 {self.strength} 点伤害!")class Mage(Character):  # 子类:法师(继承Character)def __init__(self, name, hp, magic_power):super().__init__(name, hp)self.magic_power = magic_power  # 新增属性:法力值# 新增子类特有方法def cast_spell(self):print(f"{self.name} 施放法术,消耗 {self.magic_power} 点法力!")# 使用
warrior = Warrior("亚瑟", 100, 15)
mage = Mage("梅林", 80, 30)warrior.attack()  # 输出:亚瑟 用剑造成 15 点伤害!
mage.attack()     # 输出:梅林 发动了普通攻击!(未重写时继承父类方法)
mage.cast_spell() # 输出:梅林 施放法术,消耗 30 点法力!

输出结果: 👇🏻

亚瑟 用剑造成 15 点伤害!
梅林 发动了普通攻击!
梅林 施放法术,消耗 30 点法力!
2、多态 🍓

多态的核心是:📚

  • 同一方法名:不同类可以有相同名称的方法。
  • 不同实现:每个类根据自己的需求实现该方法的不同行为。
  • 统一调用:通过父类引用调用方法,实际执行的是子类的方法。

举例: 🌰

class Animal:  # 父类def make_sound(self):pass  # 抽象方法(Python中没有真正的抽象方法,这里用pass占位)class Dog(Animal):def make_sound(self):  # 重写父类方法print("汪汪汪!")class Cat(Animal):def make_sound(self):  # 重写父类方法print("喵喵喵!")class Duck(Animal):def make_sound(self):  # 重写父类方法print("嘎嘎嘎!")# 多态的统一调用
def animal_sound(animal: Animal):animal.make_sound()  # 调用的是实际子类的方法# 使用
dog = Dog()
cat = Cat()
duck = Duck()animal_sound(dog)   # 输出:汪汪汪!
animal_sound(cat)   # 输出:喵喵喵!
animal_sound(duck)  # 输出:嘎嘎嘎!

输出结果: 👇🏻

汪汪汪!
喵喵喵!
嘎嘎嘎!
3、封装 🍓

举例: 🌰

class BankAccount:def __init__(self, account_holder, initial_balance):# 使用单下划线前缀表示"受保护"的属性(约定俗成,非强制)self._account_holder = account_holder  # 双下划线前缀会使Python进行名称修饰(name mangling),实现"私有"效果self.__balance = initial_balance     # 公开的接口方法def deposit(self, amount):if amount > 0:self.__balance += amountprint(f"存款成功,当前余额: {self.__balance}")else:print("存款金额必须大于0")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountprint(f"取款成功,当前余额: {self.__balance}")else:print("无效的取款金额")def get_balance(self):return self.__balance# 使用示例
account = BankAccount("张三", 1000)
account.deposit(500)      # 存款成功,当前余额: 1500
account.withdraw(200)     # 取款成功,当前余额: 1300
print(account.get_balance())  # 1300# 尝试直接访问私有属性(不建议这样做)
print(account._BankAccount__balance)  # 1300(通过名称修饰仍可访问)

输出结果: 👇🏻

存款成功,当前余额: 1500
取款成功,当前余额: 1300
1300
1300

在这里插入图片描述

相关文章:

  • 花哨桌面 V 3.0.0 (火影忍者版)
  • 每日刷题c++
  • 棋盘问题(放置棋子)
  • 【Phytium】飞腾FT2000/4 GPIO功能开发实例
  • Python实例题:Python实现Zip文件的暴力破解
  • 游戏盾在非游戏行业的应用实践与价值分析
  • leetcode:372. 超级次方(python3解法,数学相关算法题)
  • 【SQL】关键字
  • 在Spring Cloud中将Redis共用到Common模块
  • 健康管理系统的核心价值:降低成本,提升效率
  • leetcode701.二叉搜索树中的插入操作:迭代法利用有序性寻找空节点插入点
  • Java HashMap原理:高效键值存储的秘密
  • Spring AI(9)——MCP客户端
  • 4060显卡什么水平 4060显卡参数介绍
  • 【QT】理解QT机制之“元对象系统”
  • JavaSE:面向对象进阶之抽象类
  • [python] lock 解决线程安全问题
  • 信号与系统速成-1.绪论
  • Java面试八股(Java基础,Spring,SpringBoot篇)
  • json中对象转字符串和字符串转对象的方法
  • 交互做的很好的网站/信息流优化师培训机构
  • 高档网站制作/知名品牌营销策略
  • 自己做网站上传相册/开网店怎么推广运营
  • 网站目录安全设置/网页设计大作业
  • 十堰网站建设十堰/windows优化大师
  • 广州seo网站营销/外包服务公司