类与对象的封装
一、隐藏属性
什么是隐藏属性?
1.在函数定义阶段使用__来隐藏属性,使属性发生了语法上的变形,变成了_类名__属性名
2.属性的隐藏对内不对外
3.只有在函数定义阶段会发生变形,其他阶段__不会发生变形
class Person:
__country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def create_id():
import uuid
return uuid.uuid4()
p = Person('laowang', 18)
# 可以看到隐藏后里面的属性名变成了_Person__country
print(Person.__dict__) # {'__module__': '__main__', '_Person__country': 'China', '__init__': <function Person.__init__ at 0x000001BDD860BB70>, 'create_id': <staticmethod object at 0x000001BDD8449470>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
print(Person.country) # 报错 在外部无法用原来的属性名取值了
为什么要隐藏属性?
类里面的隐藏属性, 类外部可以使用,但是目的不是让类外部使用的,类外部要是想用,在类内部开放接口进行访问
可以达到对外部数据的严格控制
class Person:
__country = "China"
def __init__(self, name, age):
self.__name = name
self.age = age
def get_country(self):
return self.__country
def set_country(self, v):
if isinstance(v, str): # 对输入的值进行判断,如果输入错误的值则不修改
self.__country = v
return
p = Person('laowang', 18)
p.set_country('Chinse')
p.set_country(123)
print(p.get_country()) # Chinses
二、property装饰器
property装饰器的作用就是将方法伪装成属性
同时还提供设置添加修改和删除的功能的属性
class Person:
__country = "China"
def __init__(self, name, age):
self.__name = name
self.age = age
@property
def name(self):
print('name:%s' % self.__name)
@name.deleter # 设置删除功能
def name(self):
del self.__name
@name.setter # 设置添加修改功能
def name(self, v):
if isinstance(v, str): # 对输入的值进行判断,如果输入错误的值则不修改
self.__name = v
return
p = Person('laowang', 18)
p.name
p.name = 'laoxie'
p.name
del p.name
print(p.__dict__)


浙公网安备 33010602011771号