【Python基础知识库】Python类的封装

    技术2025-12-15  13

    python 类的封装

    面向对象编程的一个重要特点就是数据封装。类的封装包含数据封装、方法封装、属性封装。

    # 数据封装,将程序中需要的数据按照统一的格式封装在类型的内部,通过该类型的对象包装使用数据 class Student: def __init__(self, name, age): self.name = name self.age = age # 方法封装,函数和方法混合开发, 处理和某个数据关联的功能-> 功能代码封装成函数,将函数封装在类型中处理具体功能的方法,就和对应的数据强制关联,方便统一管理维护 def get_name(self): return self.name student = Student("张三", "18", get_name()) 属性封装(重点重点重点)

    属性是属于对象的特征,对象的特征是属于对象的数据,对象的数据一般不让外界直接访问。但是默认self.name不做任何添加的是公共的public,允许内部和外部的访问。

    受保护的protected:在对象成员前面加一个下划线self._name,允许类中或子类中都可以进行访问,但外部不可以访问。

    私有的private:在成员前面添加两个下划线self.__name,私有成员是高级别的封装,只有当前类对象自己能访问,连子类对象也不能访问到这个数据。

    # 属性封装的装饰器(https://blog.csdn.net/MrNoboday/article/details/89371430) class User(object): def __init__(self, name): self.name = name self.__age = 0 self.__gender = None @property # 只读 def age(self): if self.__age == 0: print("you haven't set age!") return None return self.__age @property def gender(self): if self.__gender is None: print("you haven't set gender!") return None return self.__gender @age.setter # 只写 def age(self, age): if 0 < age < 120: self.__age = age else: print("age set failure!") @gender.setter # 只写 def gender(self, gender): if gender.lower() in ['man', 'wowan']: self.__gender = gender.lower() else: print('gender set failure!') if __name__ == '__main__': user = User('zhangsan') print('name:', user.name, 'gender:', user.gender, 'age:',user.age) user.age = 18 user.gender = 'man' print('name:', user.name, 'gender:', user.gender, 'age:',user.age) user.age = 1000 user.gender = 'double' print('name:', user.name, 'gender:', user.gender, 'age:',user.age) user.age = 99 # 这里用了@property装饰器把方法变成属性调用的,所以直接赋值 print("间接修改的年龄: %s" % user.age) print(user._User__age = 88) print("直接修改的年龄: %s" % user.age) # 结果 ''' you haven't set gender! you haven't set age! name: zhangsan gender: None age: None name: zhangsan gender: man age: 18 age set failure! gender set failure! name: zhangsan gender: man age: 18 间接修改的年龄: 99 直接修改的年龄: 88 '''

    可以通过属性封装的装饰器去更改私有变量的值。当然还有两种常用的方法:

    间接:为这个私有变量提供一个操作方法,如def age(self, age)直接:实例名._类名__私有变量名 = 值,如user_User__age = 100
    Processed: 0.019, SQL: 9