Python 面向对象 之 封装
面向对象三大特征:
- 封装
- 继承
- 多态
定义类
class MyInfo(object):
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
if __name__ == '__main__':
show_my_info = MyInfo("zhangwanqiang", 18, "男")
print(show_my_info.name)
print(show_my_info.age)
print(show_my_info.gender)
运行结果:
zhangwanqiang
18
男
封装属性
1.1 属性的封装 一
class MyInfo(object):
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
# 为封装的属性,使用getter提供公开的方法
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def get_gender(self):
return self.__gender
# 为封装的属性,使用setter修改属性的值
def set_name(self, name):
self.__name = name
def set_age(self, age):
self.__age = age
def set_gender(self, gender):
self.__gender = gender
def __str__(self):
return "【 name = " + self.__name + ", age = " + str(self.__age) + ", gender = " + self.__gender + "】"
if __name__ == '__main__':
show_my_info = MyInfo("zhangwanqiang", 18, "男")
# 调用私有化属性的get方法来访问属性
print(show_my_info.get_name())
print(show_my_info.get_age())
print(show_my_info.get_gender())
# 调用私有化属性的set方法来访问属性
show_my_info.set_name("shuaigezhang")
show_my_info.set_age(19)
show_my_info.set_gender("男")
print(show_my_info)
运行结果:
zhangwanqiang
18
男
【 name = shuaigezhang, age = 19, gender = 男】
1.2 属性的封装 二
property
class MyInfo(object):
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
def get_gender(self):
return self.__gender
def set_gender(self, gender):
self.__gender = gender
# 第二种写法(进一步的伪装封装代码)
name = property(get_name, set_name)
age = property(get_age, set_age)
gender = property(get_gender, set_gender)
if __name__ == '__main__':
show_my_info = MyInfo("zhangwanqiang", 18, "男")
# print(show_my_info.get_name())
# show_my_info.set_name("zhangmazi")
# print(show_my_info.get_name())
print(show_my_info.name)
show_my_info.name = "z3"
print(show_my_info.name)
print(show_my_info.age)
show_my_info.age = 20
print(show_my_info.age)
print(show_my_info.gender)
show_my_info.gender = "boy"
print(show_my_info.gender)
运行结果:
zhangwanqiang
z3
18
20
男
boy
注意:这种方法对属性进行封装,可以混淆用户(感觉没有封装),但是属性确实被封装起来了。
1.3 属性的封装 三
装饰器
class MyInfo(object):
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
self.__age = age
@property
def gender(self):
return self.__gender
@gender.setter
def gender(self, gender):
self.__gender = gender
if __name__ == '__main__':
show_my_info = MyInfo("zhangwanqiang", 18, "男")
# print(show_my_info.get_name())
# show_my_info.set_name("zhangmazi")
# print(show_my_info.get_name())
print(show_my_info.name)
show_my_info.name = "z3"
print(show_my_info.name)
print(show_my_info.age)
show_my_info.age = 20
print(show_my_info.age)
print(show_my_info.gender)
show_my_info.gender = "boy"
print(show_my_info.gender)
运行结果:
zhangwanqiang
z3
18
20
男
boy
总结:在定义类的时候,一定要封装类,也就是一定要私有化属性,提供公开的set\get方法去访问。