封装特性
1 什么是封装:
总结: 隐藏对象的属性和方法实现细节,仅仅对外提供公共访问方式
目的:保护隐私
格式:__属性名=属性值
case1:
class Person: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "我叫{0},今年{1}岁".format(self.name,self.age) per = Person("johnson","25") print(per) print(per.name,per.age) per.age=-20 print(per) # 我叫johnson,今年25岁 # johnson 25 # 我叫johnson,今年-20岁
case2
class Person: def set_name(self,name): self.name = name def get_name(self): return self.name def set_age(self,age): if 0<age<100: self.age=age else: print('年龄不符合要求!') self.age=0 def get_age(self): return self.age def __str__(self): return "我叫{0},今年{1}岁".format(self.name,self.age) per = Person() per.set_name('Johnson') print(per.get_name()) per.set_age(25) print(per.get_age()) per.age=-10 print(per) # Johnson # 25 # 我叫Johnson,今年-10岁
case3
class Person: def set_name(self,name): self.__name = name def get_name(self): return self.__name def set_age(self,age): if 0<age<100: self.__age=age else: print('年龄不符合要求!') self.__age=0 def get_age(self): return self.__age def __str__(self): return "我叫{0},今年{1}岁".format(self.__name,self.__age) per = Person() per.set_name('Johnson') print(per.get_name()) per.set_age(25) print(per.get_age()) per.__age=-10 print(per) print(per.__age)
# Johnson
# 25
# 我叫Johnson,今年25岁
# -10
私有方法:在方法前添加__例如:__send_message()
私有方法作用:就是在开发的过程中保护核心代码
在类的外部不能使用(对象不能调用私有方法)
class A: def __test(self): print("--私有方法--") def test2(self): print('普通方法') a = A() # a.__test() #不能调用 a.test2()
# 普通方法
class Dog: def __init__(self): self.__baby_count=0 def birth(self): print('生了一个崽') self.__baby_count+=1 self.__holiday() def __holiday(self): print("休息了一个月产假") def __str__(self): return "孩子数量是{}".format(self.__baby_count) dog = Dog() dog.birth() print(dog) dog.baby_count=3 print(dog)
# 生了一个崽
# 休息了一个月产假
# 孩子数量是1
# 孩子数量是1
class Phone: def __phone(self): print("正在打电话") def platmoney(self,money): if money>0: self.__phone() else: print("欠费了,兄弟") phone = Phone() phone.platmoney(1) # 正在打电话
私有化封装后的限制
1.类中可以访问
2.类外/对象外不可以访问
3.子类/子类对象 不可以访问
注意事项
1.在python中实现的封装操作,不是通过权限控制而是通过改名(name mangling 改名策略)实现的,名字变了找不到而已
2.可以使用 __dict__可以查看属性(包括私有属性)的值,在类的内部使用的私有属性,python内部会自动进行转换成_类名__属性名。
在类的外部不能给对象添加私有属性,因为不能转换成_类名__属性名类型
class Person1: def set_name(self,name): self.__name = name def get_name(self): return self.__name def set_age(self,age): if 0<age<100: self.__age=age else: print('年龄不符合要求!') self.__age=0 def get_age(self): return self.__age def __str__(self): return "我叫{0},今年{1}岁".format(self.__name,self.__age) per = Person1() per.set_name("Mary") per.set_age(25) print(per) print(per.__dict__) per.__age = -10 print(per) print(per.__age) print(per.__dict__)
我叫Mary,今年25岁
# {'_Person1__name': 'Mary', '_Person1__age': 25}
# 我叫Mary,今年25岁
# -10
# {'_Person1__name': 'Mary', '_Person1__age': 25, '__age': -10}
修改私有属性 per._Person1__age = -10 print(per) print(per.__dict__) {'_Person1__name': 'Mary', '_Person1__age': 25, '__age': -10} 我叫Mary,今年-10岁 {'_Person1__name': 'Mary', '_Person1__age': -10, '__age': -10}