


今天的基础篇内容讲解面向对象三大特性(1)-封装的基本知识,大家这么聪明,一看就会了,主要内容是介绍下封装的内容。

1. 封装:顾名思义,我们将变量和函数写入类中的操作即为封装--类中封装了属性和方法。通过封装的方式,我们可以将一些细节私有化,只暴露出必要的接口供调用者使用。

1.1 私有化:限制属性和方法只能在类内访问,外部无法访问,或者说父类中某些属性和方法不希望被子类继承,我们可以将其私有化。私有化有两种方式:单下划线型和双下划线型
单下划线:实际工作中,大家都遵循这样一个约定:当有一个前缀下划线的变量或方法应被视为非公开的API,但这种约定不具有强制力,也就是咱们大家约定俗成的东西。
双下划线:当有两个前缀下划线的变量或方法被视为非公开的API,这是强制的私有化,也就是真正意义上的私有。
1.2 私有属性: 我们通过双下划线定义私有属性。
# 私有属性class Student:def __init__(self, name, age):# 普通属性:可以直接外部访问self.name = name# 私有属性:以双下划线 __ 开头,限制外部直接访问self.__age = age # 私有属性:年龄# 提供公开(API接口)方法,用于获取私有属性(读)def get_age(self):"""获取私有属性__age的值"""return self.__age# 提供公开方法(API接口),用于修改私有属性(写)def set_age(self, new_age):"""修改私有属性__age"""if isinstance(new_age, int) and 0 < new_age < 100:self.__age = new_ageelse:print("年龄必须是0-100之间的整数!")# 1. 创建对象stu = Student("小明", 18)# 2. 访问普通属性print("直接访问普通属性name:", stu.name) # 输出:直接访问普通属性name:小明# 3. 尝试直接访问私有属性(会报错,体现私有性)# print(stu.__age) # 取消注释会报错:AttributeError: 'Student' object has no attribute '__age'# 4. 通过公开方法访问私有属性print("通过方法获取年龄:", stu.get_age()) # 输出:通过方法获取年龄:18# 5. 通过公开方法修改私有属性(合法值)stu.set_age(19)print("修改后通过方法获取年龄:", stu.get_age()) # 输出:修改后通过方法获取年龄:19
1.3 私有方法:同理,我们通过双下划线定义私有方法。
# 私有方法class Calculator:# 普通方法:可以外部直接调用def public_add(self, a, b):"""公开的加法方法"""return a + b# 私有方法:以两个下划线 __ 开头,限制外部直接访问def __private_multiply(self, a, b):"""私有的乘法方法(仅内部使用)"""return a * b# 公开方法:作为“桥梁”,内部调用私有方法def public_calculate(self, a, b):# 内部调用私有乘法方法multiply_result = self.__private_multiply(a, b)# 返回结果return f"乘法结果:{multiply_result}"# 1. 创建对象calc = Calculator()# 2. 调用公开方法(正常)print("调用公开加法方法:", calc.public_add(3, 5)) # 输出:调用公开加法方法:8# 3. 尝试直接调用私有方法(会报错,体现私有性)# print(calc.__private_multiply(3, 5)) # 取消注释会报错:AttributeError: 'Calculator' object has no attribute '__private_multiply'# 4. 通过公开方法间接调用私有方法(核心用法)print(calc.public_calculate(4, 6))
# 定义 Person 类,演示@property装饰器的基础使用class Person:# 初始化方法,定义属性def __init__(self, age):self.age = age# 使用@property装饰器,将方法转为属性调用@propertydef age(self):print(f"He is {self.age}")# 创建Person实例p = Person(18)# 调用被@property装饰的方法(无需加括号,像访问属性一样)p.age # 输出:He is 18
name() 方法,让你可以通过p.name直接获取私有属性,语法像访问普通属性一样简洁。name()方法,让你可以通过p.name = "李四" 看似 “直接赋值” 的方式修改私有属性,底层实际调用了方法,你还可以在这个方法里加校验逻辑(比如限制姓名长度)。# 结合私有属性和 property 装饰器实现可控的属性访问/修改class Person:# 初始化定义私有属性 __name(双下划线开头)def __init__(self, name):self.__name = name # 私有属性,外部无法直接访问/修改# @property装饰器:将方法转为“只读属性”,用于获取私有属性值@propertydef name(self):return self.__name # 返回私有属性 __name 的值# @name.setter装饰器:为name属性添加“写”权限,用于修改私有属性@name.setterdef name(self, name):self.__name = name # 将传入的新值赋值给私有属性 __namep = Person("小明")print(p.name) # 输出:小明(通过 property 访问私有属性)p.name = "小红" # 通过 setter 修改私有属性(看似直接赋值,实际调用方法)print(p.name) # 输出:小红(验证修改成功)



总结:今日我们学习了Python基础篇-面向对象的三大特性(1)-封装:在Python基础篇,封装的核心是把属性设为私有属性(强制以双下划线 __ 开头),避免外部直接访问和随意修改,保护数据安全。为了方便读写私有属性,我们使用@property实现只读访问,再通过@属性名.setter实现可修改,让外部可以像使用普通属性一样简洁地获取和设置值,同时还能在内部增加数据校验,让代码更安全、规范、易维护。后续我们将持续学习Python基础知识,祝每一位study er学习愉快。




