面向对象的特征——封装的意义和操作过程
封装
将对象敏感的数据封装在类的内部,不让外界直接访问,而是通过当前类提供的set/get方法间接访问数据,此时就可以在set/get中添加限制条件进行访问数据的控制。
封装实现的步骤:
定义类型,封装零散数据【抽象的属性】
[使用__slots__属性,限制当前类的属性列表 为了代码的统一性]
所有属性私有化【属性使用双下划线开头,外界就不能直接访问这样的属性了】
给每个属性提供set/get方法,在方法中添加限制条件
class Person:
def __init__(self,name,age):
self.__name = name
self.__age = age
def set_name(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_age(self,age):
self.__age = age
def get_age(self):
return self.__age
p = Person("问问",11)
print(p.get_name(),p.get_age())
p.set_name("好好")
p.set_age(33)
print(p.get_name(),p.get_age())
高级封装
使用@property和@get_method.setter注解,来注释set/get方法,隐藏set/get方法的实现,让方法的使用方式和属性一致
伪方法重载:python中,默认不提供方法重载,但是在高级封装的过程中,又出现了类似方法重载的代码语法,所以~称之为伪方法重载。
class Person:
def __init__(self,name,age):
self.__name = name
self.__age = age
@property
def get_name(self):
return self.__name
@get_name.setter
def set_name(self,name):
self.__name = name
@property
def get_age(self):
return self.__age
@get_age.setter
def set_age(self,age):
self.__age = age
def eat(self):
print("吃1234567")
p = Person("问问",11)
print(p.get_name,p.get_age)
p.set_name = "好好"
p.set_age = 33
print(p.get_name,p.get_age)
p.eat()
对方法的封装
在封装的过程中,除了封装私有属性,还可以针对一些底层的操作方法进行私有化,将方法封装在类的内部,通过提供的一个公共方法来控制该方法的访问权限
class MsgManagerment:
def __sen_vilidata_code(self,code):
print("发送验证码%s" % code)
def sen_msg(self,type,code):
if type == "1":
self.__sen_vilidata_code(code)
return 0
else:
return "没有权限"
m = MsgManagerment()
re = m.sen_msg("2","12345789")
print(re)