封装
定义:
数据角度上讲:将一些基本数据类型复合成一个自定义类型
行为角度上讲:向类外提供必要的功能,隐藏实现的细节
设计角度上讲:
1、分而治之:将一个大的需求分解为许多类,每个类处理一个独立的功能
拆分的好处:便于分工,便于复用,可扩展性强
2、变则疏之:变化的地方独立包装,避免影响其他类
3、高内聚:类中各个方法都在一起完成一项任务,单一职责的类
4、低耦合:类与类之间关系的松散
知识点补充:
类名.dict()显示类的实例对象的全部属性,结果为字典类型
数据角度,将一个对象的所有属性封装成一个自定义的类`
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
def printf(self):
print(self.name,self.age)
s=Student('小化',10)
s.printf()
print(s.__dict__)
行为角度:将一些属性设置为私有化(障眼法)
class Student:
def __init__(self,name,age):
self.name=name
#将某个需要私有化的属性前面加两个下划线即可私有,但是只是障眼法
self.set_age(age)#初始化年龄
#获取年龄
def get_age(self):
return self.__age
#设置年龄
def set_age(self,value):
self.__age=value
s=Student('小化',10)
#通过实例明._类名+属性还是可以访问该私有属性:所以私有化的属性实际上还是可以访问的到
s._Student__age=19
print(s._Student__age)
print(s.__dict__)
设计角度:使用property对象拦截直接用 实例名称.age 变量的直接读写操作
#实例的全部属性没有age而是__age(隐藏)
class Student:
def __init__(self,name,age):
self.name=name
self.age=age #跳转到set_age方法
#获取年龄
def get_age(self):
return self.__age
#设置年龄
def set_age(self,value):
self.__age=value
#利用property对象拦截直接用实例名称.age变量的直接读写操作
#而是当直接利用 实例名.age时赋值跳转到set_age方法,读取时跳转到get_set方法
age=property(get_age,set_age)
s=Student('小化',10)
print(s.age)#跳转到get_age方法
print(s.__dict__)