资讯动态

Python面向对象编程:类与对象基础

发布时间:2026/8/29 17:14:51 来源:尧图企业网站定制
Python面向对象编程类与对象基础面向对象编程OOP是编程的重要范式Python是一门完全面向对象的语言。本篇将学习类与对象的基本概念、定义和使用。一、什么是面向对象1. 面向过程 vs 面向对象面向过程以「动作」为中心关注「怎么做」用函数组织代码面向对象以「事物」为中心关注「谁来做」用类和对象组织代码生活类比面向过程把大象装进冰箱 → 开门 → 装大象 → 关门关注步骤面向对象冰箱有开门/关门方法大象有被装的属性关注对象2. 类与对象的关系类Class是模板/蓝图描述一类事物的共同特征和行为对象Object是类的具体实例是真实存在的个体比如「人类」是一个类「张三」是人类的一个对象「汽车」是一个类「你家那辆车」是汽车的一个对象二、定义类和创建对象1. 基本语法class类名:类文档字符串def__init__(self,参数列表):初始化方法创建对象时自动调用self.属性名参数def方法名(self,参数列表):实例方法方法体2. 第一个类PersonclassPerson:人类def__init__(self,name,age):初始化方法self.namename# 实例属性self.ageagedefsay_hello(self):打招呼方法print(f你好我叫{self.name}今年{self.age}岁)defhave_birthday(self):过生日年龄1self.age1print(f生日快乐{self.name}现在{self.age}岁了)# 创建对象实例化p1Person(小明,18)p2Person(小红,17)# 调用方法p1.say_hello()# 你好我叫小明今年18岁p2.say_hello()# 你好我叫小红今年17岁p1.have_birthday()# 生日快乐小明现在19岁了# 访问属性print(p1.name)# 小明print(p1.age)# 193. self是什么self代表当前对象本身类似于其他语言中的this。定义方法时第一个参数必须是self约定俗成也可以叫别的名字但不建议调用方法时不需要手动传selfPython会自动传入通过self可以访问对象的属性和其他方法classDemo:defshow(self):print(fself的id:{id(self)})dDemo()d.show()# self的id: 140...print(fd的id:{id(d)})# d的id: 140...和self相同三、属性详解1. 实例属性 vs 类属性classDog:# 类属性所有实例共享species犬科动物count0# 计数器def__init__(self,name,age):# 实例属性每个实例独有self.namename self.ageage Dog.count1# 创建一个实例计数器1# 创建实例d1Dog(旺财,3)d2Dog(大黄,5)# 实例属性每个对象不同print(d1.name)# 旺财print(d2.name)# 大黄# 类属性所有对象共享print(d1.species)# 犬科动物print(d2.species)# 犬科动物print(Dog.count)# 2创建了2个实例# 修改类属性通过类名修改影响所有实例Dog.species哺乳动物print(d1.species)# 哺乳动物# 通过实例修改类属性实际上是创建了同名实例属性不影响其他实例d1.species小狗狗print(d1.species)# 小狗狗实例属性print(d2.species)# 哺乳动物还是类属性2. 属性访问控制Python没有真正的私有属性但有约定classBankAccount:def__init__(self,owner,balance):self.ownerowner# 公开属性self._balancebalance# 约定为内部使用单下划线self.__password1234# 名称修饰外部不能直接访问双下划线defget_balance(self):获取余额通过方法访问私有属性returnself._balancedefdeposit(self,amount):存款ifamount0:self._balanceamountprint(f存款{amount}成功余额{self._balance})else:print(存款金额必须大于0)accountBankAccount(小明,1000)print(account.get_balance())# 1000account.deposit(500)# 存款500成功余额1500# print(account.__password) # 报错不能直接访问print(account._BankAccount__password)# 可以通过这种方式访问不推荐⚠️ Python的「私有」是约定大于强制双下划线只是名称修饰不是真正的访问控制。3. property装饰器用property可以把方法变成属性访问实现getter/setter。classStudent:def__init__(self,name,score):self.namename self._scorescorepropertydefscore(self):获取分数getterreturnself._scorescore.setterdefscore(self,value):设置分数setter可以加验证逻辑if0value100:self._scorevalueelse:raiseValueError(分数必须在0-100之间)propertydefgrade(self):只读属性只有getter没有setterifself._score90:returnAelifself._score80:returnBelifself._score60:returnCelse:returnDsStudent(小明,85)print(s.score)# 85像访问属性一样调用方法print(s.grade)# Bs.score95# 通过setter修改print(s.score)# 95print(s.grade)# A# s.score 120 # 会抛出ValueError四、方法详解1. 实例方法最常见的方法第一个参数是self可以访问实例属性和类属性。classExample:definstance_method(self):print(这是实例方法,self)2. 类方法用classmethod装饰第一个参数是cls代表类本身。classPerson:total0def__init__(self,name):self.namename Person.total1classmethoddefget_total(cls):类方法访问类属性returncls.totalclassmethoddeffrom_string(cls,info_str):类方法作为备用构造函数nameinfo_str.split(-)[0]returncls(name)# cls相当于Personprint(Person.get_total())# 0p1Person(小明)print(Person.get_total())# 1# 用类方法创建对象p2Person.from_string(小红-18)print(p2.name)# 小红3. 静态方法用staticmethod装饰不需要self或cls参数就是普通函数放在类里。classMathUtils:staticmethoddefis_even(n):判断是否为偶数returnn%20staticmethoddefmax_of(a,b):returnaifabelseb# 不需要创建对象直接通过类调用print(MathUtils.is_even(4))# Trueprint(MathUtils.max_of(3,5))# 54. 三种方法对比方法类型装饰器第一个参数能访问实例属性能访问类属性实例方法无self✅✅类方法classmethodcls❌✅静态方法staticmethod无❌❌五、实战银行账户类classBankAccount:银行账户类# 类属性bank_namePython银行total_accounts0def__init__(self,owner,balance0):初始化账户self.ownerowner self.__balancebalance# 私有属性self.transaction_history[]# 交易记录BankAccount.total_accounts1propertydefbalance(self):只读余额属性returnself.__balancedefdeposit(self,amount):存款ifamount0:print(存款金额必须大于0)returnFalseself.__balanceamount self.transaction_history.append((存款,amount))print(f存款成功{amount}元当前余额{self.__balance}元)returnTruedefwithdraw(self,amount):取款ifamount0:print(取款金额必须大于0)returnFalseifamountself.__balance:print(余额不足)returnFalseself.__balance-amount self.transaction_history.append((取款,amount))print(f取款成功-{amount}元当前余额{self.__balance}元)returnTruedeftransfer(self,target,amount):转账到另一个账户ifself.withdraw(amount):target.deposit(amount)print(f转账成功从{self.owner}转到{target.owner}{amount}元)returnTruereturnFalsedefshow_history(self):显示交易记录print(f\n{self.owner}的交易记录)forop,amountinself.transaction_history:print(f{op}:{amount}元)print(f 最终余额:{self.__balance}元)classmethoddefget_total_accounts(cls):获取总账户数returncls.total_accounts# 使用示例print(f欢迎使用{BankAccount.bank_name})print(f当前总账户数{BankAccount.get_total_accounts()})# 创建账户acc1BankAccount(小明,1000)acc2BankAccount(小红,500)# 操作acc1.deposit(500)acc1.withdraw(200)acc1.transfer(acc2,300)# 查看记录acc1.show_history()acc2.show_history()print(f\n当前总账户数{BankAccount.get_total_accounts()})六、常见坑点__init__没有return初始化方法不能返回值只能返回None忘记self方法定义时第一个参数必须是self否则调用时报错类属性和实例属性混淆修改类属性要用类名通过实例修改会创建同名实例属性可变对象作为类属性所有实例共享同一个列表/字典修改会互相影响classDemo:items[]# 危险所有实例共享d1Demo()d2Demo()d1.items.append(1)print(d2.items)# [1]被影响了七、课后练习定义一个Circle类包含半径属性实现计算面积和周长的方法定义一个Book类包含书名、作者、价格属性用property实现价格不能为负数定义一个Car类包含品牌、速度属性实现加速、减速方法速度不能为负定义一个Student类用类方法实现从字符串创建学生对象如张三,18,90八、小结本篇学习了面向对象的基本概念、类的定义、实例属性与类属性、三种方法类型实例方法/类方法/静态方法以及property装饰器。面向对象是编程的重要思维方式下一篇将学习继承、多态等进阶特性。下一篇预告《Python面向对象进阶继承、多态与魔术方法》本专栏持续更新中欢迎点赞、收藏、关注三连支持

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价