Python 中可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类,不想被外界调用,体现了封装性
受保护属性和方法
语法: 在受保护的 属性 或 方法 ,使用一个下划线「 _ 」开头。 ```python class Person(object): def init(self):
self._age = age # 声明这是受保护属性
def _eat(self): # 声明这是受保护的方法
print(f'这是一个受保护的吃货')
kuma = Person(24)
print(kuma._age) # 强行访问受保护的属性
kuma._eat() # 强行访问方法
24
这是一个受保护的吃货 ``` 类中的属性或方法声明不想被外界调用,但是外界依旧可以调用,那么就叫做受保护的属性或者方法
私有属性和方法
防止外部随意存储类的内部数据(变量),内部数据(变量)会被封装为”私有变量”。外部只能通过方法调用私有变量
语法: 在私有 属性 和 方法,使用两个下划线 「 __ 」开头 ```python class Person(object): __name = ‘kuma’ # 私有类属性
def init(self, age):
self.__age = age # 私有实例属性
kuma = Person(24) print(kuma.__age) # 错误发生
print(Person.__name)
AttributeError: ‘Person’ object has no attribute ‘age’ AttributeError: type object ‘Person’ has no attribute ‘name’ ``` 类中的属性和方法不想让外界调用,可以使用私有属性和方法
获取私有属性或方法
get() 和 set() 方法 ```python class Person(object): def init(self, age):
self.__age = age
def get_age(self): # get 方法,定义 get()方法,返回私有变量 __age
return f'年纪是{self.__age}'
def set_age(self, age): # set 方法,定义 set()方法,更新私有变量 __age
self.__age = age
kuma = Person(24) kuma.get_age()
print(kuma.Person__age) # 通过 实例.类名__变量名 来获取私有变量
kuma.set_age(40) # 通过 set() 赋值
print(kuma.get_age)
24 24 40 ``` 以上获取方式不建议使用,否则设置私有属性、方法失去意义
@property 装饰器 ```python class Dog(object): def init(self, name):
self.__name = name
@property # 使用 @property 装饰器定义 name 属性的 get() 方法 def name(self): # 方法名就是属性名,即 name。 替代 get_name(self)
return self.__name
@name.setter # 使用 @name.setter 装饰器定义 name 属性的 set() 方法 def name(self, name): # 替代 set_name(self, name)
self.__name = name
d1 = Dog(‘tom’) print(f’这狗叫 {d1.name}’) # 通过 实例.属性 获取属性
d1.name = ‘jerry’ # 通过 实例.属性 赋值修改
print(f’这狗叫 {d1.name}’)
这狗叫 tom 这狗叫 jerry ``` 属性在本质上就是两个方法,在方法前加上装饰器使得方法成为属性
拓展
看完类的继承再来看此案例
class Person(object):def __init__(self, name):self.__name = namedef greet(self):print(f'hello, my name is {self.__name}')class Student(Person):def greet(self):print(f'hello, my name is {self.__name}')s = Student('kuma')s.greet()------------------------------------------------------------------------>>> AttributeError: 'Student' object has no attribute '_Student__name'
子类是不能继承调用父类私有属性和方法,但是可以继承调用父类的受保护属性和方法
