12.2 面向对象的三大特征
12.2.1 封装
面向对象的封装:将属性和方法封装到一个类多个类,需要使用的时候,调用这些属性和方法
封装数据:主要原因是:保护私隐,明确区分内外。将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name=" + self.__name
#如何让外部访问到私有的属性
getter setter
# 提供公开的get方法访问
def get_name(self):
return self.__name
# 提供公共的set方法修改
def set_name(self, username):
self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
# print(u)
print(u.get_name())
# print(u.age)
u.name = "lisi"
print(u.name)
封装的第二种方法:property()
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel def __str__(self):
return "name=" + self.__name
#如何让外部访问到私有的属性
getter setter
# 提供公开的get方法访问
def get_name(self):
return self.__name
# 提供公共的set方法修改
def set_name(self, username):
self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
#获取值的时候调用property()的第一个参数
name = property(get_name, set_name)
age = property(get_age, set_age)
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
print(u) u.name = "lisi"
print(u)
# print(u.get_name())
# print(u.age)
# u.name = "lisi"
# print(u.name)
# u.set_name("lisi")
# print(u.get_name())
封装的第三种方式:装饰器 @property
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name=" + self.__name
@property def name(self):
return self.__name
@name.setter
def name(self, username):
self.__name = username
#如何让外部访问到私有的属性
getter setter
# 提供公开的get方法访问
# def get_name(self):
# return self.__name
# 提供公共的set方法修改
#def set_name(self, username):
# self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
#获取值的时候调用
property()的第一个参数
# name = property(get_name, set_name)
# age = property(get_age, set_age)
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
print(u.name) u.name = "lisi"
print(u)
# print(u.get_name())
# print(u.age)
# u.name = "lisi"
# print(u.name)
# u.set_name("lisi")
# print(u.get_name())