news 2026/10/20 21:00:23

Python面向对象编程基础技术报告:类、对象、封装、属性与方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python面向对象编程基础技术报告:类、对象、封装、属性与方法

面向对象编程(Object-Oriented Programming, OOP)是现代编程语言的核心范式之一,它通过“类”和“对象”的概念,将现实世界中的事物抽象为程序中的实体,从而提高代码的可复用性、可维护性和可扩展性。Python作为一门支持多范式编程的高级语言,其面向对象特性简洁而强大,既保留了OOP的核心思想,又通过动态类型、内置方法等机制降低了使用门槛。本报告将以Python为例,系统阐述类与对象、封装、成员属性与成员方法等核心概念,并结合代码示例与解析,展现Python面向对象的独特亮点。

二、类与对象:抽象与实例化的基石

类(Class)是对一类事物的抽象描述,它定义了该类事物共有的属性(数据)和方法(行为);对象(Object)则是类的具体实例,是类在内存中的具体存在。例如,“学生”是一个类,而“张三”“李四”则是“学生”类的两个对象。

在Python中,类的定义使用class关键字,语法如下:

class类名:# 类体(属性与方法)

其中,类名通常采用大驼峰命名法(如Student、Person)。类的实例化则通过“类名()”实现,例如:

classStudent:pass# 空类,仅用于演示# 实例化对象s1=Student()s2=Student()print(type(s1))# <class '__main__.Student'>print(s1==s2)# False,不同对象

上述代码中,Student类没有定义任何属性或方法,因此s1和s2是空对象,但它们各自拥有独立的内存空间,互不影响。

三、成员属性:对象的状态存储

成员属性(Member Attributes)是对象用于存储状态的数据,分为实例属性和类属性两类。

  1. 实例属性:属于单个对象,每个对象的实例属性独立存在。通常在构造方法__init__中通过self.属性名定义,例如:
classStudent:def__init__(self,name,age):self.name=name# 实例属性self.age=age# 实例属性s1=Student("张三",20)s2=Student("李四",21)print(s1.name)# 张三print(s2.name)# 李四s1.age=22# 仅修改s1的age,不影响s2print(s2.age)# 21
  1. 类属性:属于类本身,所有对象共享同一份数据。定义在类体中、方法之外,例如:
classStudent:school="XX大学"# 类属性def__init__(self,name):self.name=name s1=Student("张三")s2=Student("李四")print(s1.school)# XX大学print(s2.school)# XX大学Student.school="YY大学"# 修改类属性,所有对象生效print(s1.school)# YY大学

需要注意的是,若通过对象修改类属性(如s1.school = “ZZ大学”),实际上是为s1新增了一个实例属性,并不会影响类属性本身或其他对象。

四、成员方法:对象的行为定义

成员方法(Member Methods)是定义在类中的函数,用于描述对象的行为。Python中的成员方法分为实例方法、类方法和静态方法三类。

  1. 实例方法:第一个参数必须是self(代表当前对象),通过对象调用,用于操作实例属性。例如:
classStudent:def__init__(self,name,score):self.name=name self.score=scoredefintroduce(self):# 实例方法print(f"我叫{self.name},成绩是{self.score}")defpass_exam(self):# 实例方法returnself.score>=60s=Student("张三",85)s.introduce()# 我叫张三,成绩是85print(s.pass_exam())# True
  1. 类方法:使用@classmethod装饰器,第一个参数是cls(代表类本身),通过类或对象调用,常用于工厂模式或操作类属性。例如:
classStudent:count=0# 类属性:记录学生总数def__init__(self,name):self.name=name Student.count+=1@classmethoddefget_count(cls):# 类方法returncls.count s1=Student("张三")s2=Student("李四")print(Student.get_count())# 2(通过类调用)print(s1.get_count())# 2(通过对象调用)
  1. 静态方法:使用@staticmethod装饰器,无self或cls参数,通过类或对象调用,用于定义与类相关但不依赖对象或类状态的辅助函数。例如:
classMathUtils:@staticmethoddefadd(a,b):# 静态方法returna+bprint(MathUtils.add(1,2))# 3
五、封装:隐藏内部实现,暴露安全接口

封装(Encapsulation)是OOP的核心特性之一,其目的是将对象的内部状态(属性)隐藏起来,仅通过公开的方法(接口)对外提供服务,从而避免外部直接修改导致数据不一致。

在Python中,封装通过“命名约定”实现,而非强制访问控制:

  • 单下划线前缀(_attr):约定为“受保护”属性,外部不应直接访问,但Python不会强制限制;
  • 双下划线前缀(__attr):触发名称改写(Name Mangling),外部无法直接通过__attr访问,需通过_类名__attr访问(不推荐),从而实现“伪私有”。

例如:

classBankAccount:def__init__(self,owner,balance):self.owner=owner self.__balance=balance# 私有属性(伪私有)defdeposit(self,amount):ifamount>0:self.__balance+=amountprint(f"存入{amount},余额{self.__balance}")else:print("存入金额必须大于0")defwithdraw(self,amount):if0<amount<=self.__balance:self.__balance-=amountprint(f"取出{amount},余额{self.__balance}")else:print("余额不足或金额无效")defget_balance(self):# 公开接口,用于查询余额returnself.__balance account=BankAccount("张三",1000)account.deposit(500)# 存入500,余额1500account.withdraw(200)# 取出200,余额1300print(account.get_balance())# 1300# print(account.__balance) # 报错:AttributeErrorprint(account._BankAccount__balance)# 1300(不推荐直接访问)

上述代码中,__balance是私有属性,外部无法直接修改,必须通过deposit、withdraw、get_balance等公开方法操作,从而保证了余额数据的安全性。

六、Python面向对象的独特亮点
  1. 动态属性与方法:Python允许在运行时为对象动态添加属性或方法,例如:
classDog:passd=Dog()d.name="旺财"# 动态添加属性defbark(self):print(f"{self.name}在叫")d.bark=bark.__get__(d)# 动态绑定方法d.bark()# 旺财在叫
  1. 内置方法(魔术方法):Python提供了大量以双下划线开头和结尾的内置方法(如__str__、eq、add),允许自定义对象的行为,例如:
classVector:def__init__(self,x,y):self.x=x self.y=ydef__str__(self):# 自定义字符串表示returnf"Vector({self.x},{self.y})"def__add__(self,other):# 自定义加法returnVector(self.x+other.x,self.y+other.y)v1=Vector(1,2)v2=Vector(3,4)print(v1+v2)# Vector(4, 6)
  1. 属性装饰器(@property):可将方法伪装成属性,实现“取值”和“设值”的控制,例如:
classCircle:def__init__(self,radius):self.radius=radius@propertydefarea(self):# 只读属性return3.14*self.radius**2@propertydefradius(self):returnself._radius@radius.setterdefradius(self,value):ifvalue>0:self._radius=valueelse:raiseValueError("半径必须大于0")c=Circle(5)print(c.area)# 78.5(无需调用方法,直接像属性一样访问)c.radius=-1# 报错:ValueError
七、总结

Python的面向对象编程以“简洁”和“灵活”为核心特点:类与对象的定义直观易懂,成员属性和方法的分类清晰,封装机制通过命名约定实现“约定优于强制”,而动态特性、内置方法和属性装饰器等亮点则进一步提升了代码的表现力。掌握这些核心概念,不仅能够帮助我们编写出结构清晰、可维护的代码,还能为学习继承、多态等更高级的OOP特性奠定基础。在实际开发中,应遵循“高内聚、低耦合”的原则,合理使用封装、抽象等机制,让代码既符合OOP思想,又充分发挥Python的语言优势。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 16:51:07

NFC天线赛道七家厂商差异化定位观察

从全球巨头到细分专家&#xff0c;实佳凭FPC射频认证卡位金融支付NFC天线看似只是一个13.56MHz的线圈&#xff0c;但背后的供应链格局远比想象中复杂。有从手机天线起家、做到全球份额前列的国内龙头&#xff1b;有从连接器延伸而来、以工业级可靠性著称的跨国巨头&#xff1b;…

作者头像 李华
网站建设 2026/10/21 15:40:29

动物园换了围挡和入口,AR导航应该先改哪一层?

动物园里的路从来不是一张长期不变的平面图。树木会长高&#xff0c;季节会改变道路外观&#xff0c;场馆入口可能因施工调整&#xff0c;节假日还会临时增加围挡和单向通行。对普通游客来说&#xff0c;这些变化只是“今天这条路不好走”&#xff1b;对AR导航系统来说&#xf…

作者头像 李华
网站建设 2026/10/21 6:59:12

觅感科技首发行业24G毫米波3T3R雷达模组方案

为满足智能家居家电照明等多目标空间感知&#xff0c;两轮车盲区监测等对雷达能力提出的全新要求&#xff0c;历时半年&#xff0c;觅感科技正式发布行业首款24G毫米波三发三收&#xff08;3T3R&#xff09;系列雷达模组方案&#xff0c;该方案基于全新一代24GHz毫米波高性能3T…

作者头像 李华
网站建设 2026/10/21 11:21:53

企业微信自动回复怎么设置?先分清三个入口

后台里跟自动回复沾边的开关有好几处&#xff0c;不少人配完其中一处就以为齐活了&#xff0c;结果新客户加进来没人打招呼&#xff0c;或者同一个问题被回复了两遍。问题不在配置有多难&#xff0c;而在没分清入口——企业微信的自动回复分三层&#xff0c;各管一段&#xff0…

作者头像 李华
网站建设 2026/10/18 8:20:50

题解:洛谷 P1588 [USACO07OPEN] Catch That Cow S

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

作者头像 李华