一、封装
1、定义:
数据角度上讲:将一些基本数据类型复合成一个自定义类型
行为角度上讲:向类外提供必要的功能,隐藏实现的细节
设计角度上讲:
1、分而治之:将一个大的需求分解为许多类,每个类处理一个独立的功能
拆分的好处:便于分工,便于复用,可扩展性强
2、变则疏之:变化的地方独立包装,避免影响其他类
3、高内聚:类中各个方法都在一起完成一项任务,单一职责的类
4、低耦合:类与类之间关系的松散
2、知识点补充:
类名.dict()显示类的实例对象的全部属性,结果为字典类型
1、数据角度
将一个对象的所有属性封装成一个自定义的类
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__)
2、行为角度
将一些属性设置为私有化(障眼法)
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__)
3、设计角度
使用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__)
方法二:
class Student:
def __init__(self,name,age):
self.name=name
self.age=age #跳转到age方法
@property #创建property对象,只负责拦截读取操作
def age(self):
return self.__age
@age.setter
def age(self,value):#只负责拦截写入操作
self.__age=value
s=Student('小化',10)
print(s.age)#跳转到get_age方法
print(s.__dict__)
4、练习
#小明去招商银行取钱
class Person:
def __init__(self,name):
self.name=name
@property
def name(self):
return self.__name;
@name.setter
def name(self, name):
self.__name = name
class Bank:
def __init__(self,name):
self.name=name
@property
def name(self):
return self.__name;
@name.setter
def name(self,name):
self.__name=name
def draw_money(self,person):
print(person.name+"去"+self.name+"取钱")
p=Person("小明")
b=Bank("招商银行")
b.draw_money(p)