Python 中可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类,不想被外界调用体现了封装性

受保护属性和方法

  • 语法: 在受保护的 属性 或 方法 ,使用一个下划线「 _ 」开头。 ```python class Person(object): def init(self):

    1. self._age = age # 声明这是受保护属性

    def _eat(self): # 声明这是受保护的方法

    1. print(f'这是一个受保护的吃货')

kuma = Person(24)

print(kuma._age) # 强行访问受保护的属性

kuma._eat() # 强行访问方法

24
这是一个受保护的吃货 ``` 类中的属性或方法声明不想被外界调用,但是外界依旧可以调用,那么就叫做受保护的属性或者方法

私有属性和方法

防止外部随意存储类的内部数据(变量),内部数据(变量)会被封装为”私有变量”。外部只能通过方法调用私有变量

  • 语法: 在私有 属性 和 方法,使用两个下划线 「 __ 」开头 ```python class Person(object): __name = ‘kuma’ # 私有类属性

    def init(self, age):

    1. 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):

    1. self.__age = age

    def get_age(self): # get 方法,定义 get()方法,返回私有变量 __age

    1. return f'年纪是{self.__age}'

    def set_age(self, age): # set 方法,定义 set()方法,更新私有变量 __age

    1. 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):

    1. self.__name = name

    @property # 使用 @property 装饰器定义 name 属性的 get() 方法 def name(self): # 方法名就是属性名,即 name。 替代 get_name(self)

    1. return self.__name

    @name.setter # 使用 @name.setter 装饰器定义 name 属性的 set() 方法 def name(self, name): # 替代 set_name(self, name)

    1. self.__name = name

d1 = Dog(‘tom’) print(f’这狗叫 {d1.name}’) # 通过 实例.属性 获取属性

d1.name = ‘jerry’ # 通过 实例.属性 赋值修改

print(f’这狗叫 {d1.name}’)

这狗叫 tom 这狗叫 jerry ``` 属性在本质上就是两个方法,在方法前加上装饰器使得方法成为属性

拓展

看完类的继承再来看此案例

  1. class Person(object):
  2. def __init__(self, name):
  3. self.__name = name
  4. def greet(self):
  5. print(f'hello, my name is {self.__name}')
  6. class Student(Person):
  7. def greet(self):
  8. print(f'hello, my name is {self.__name}')
  9. s = Student('kuma')
  10. s.greet()
  11. ------------------------------------------------------------------------
  12. >>> AttributeError: 'Student' object has no attribute '_Student__name'

子类是不能继承调用父类私有属性和方法,但是可以继承调用父类的受保护属性和方法