42.封装

发布时间 2023-11-17 14:35:45作者: 想要暴富的小男孩

访问控制

在Python中并没有像Java,C++ 一样,提供了 publicprotectedprivate 这样的访问控制修饰符,Python 通过一种称为 名称改写的方式,实现其它语言中访问控制修饰符的作用。

但是要注意的是,在Python中名称改写只是一种约定,并没有真正的实现私有的作用,在 Python 中只要想访问,所有的数据都可以拿到,获取方法在这里不讨论。

无下划线前缀(公有权限)

Python 中默认定义的属性和方法,都是公有的方法。无论是在类外,还是在派生的子类中,都可以进行访问,类似其它语言中的 public 修饰符的作用。

class A(object):
def __init__(self):
# 公有属性
self.a = 10

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外使用公有方法
obj.show()

_ 单下划线前缀(保护权限)

Python 在类中使用 单下划线前缀 实现其它语言中 protected 保护权限的功能,在属性或方法(包括类属性和类方法,作用相同)前添加一个单下划线,该属性或方法,在当前类中可以访问,

在类外理论上不可访问(使用时不提示,但写出来程序可以运行,但有警告),在通过继承派生的子类中可以访问(继承在后面讲解)。

class A(object):
def __init__(self):
# 公有属性
self.a = 10
# 保护属性
self._b = 12

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')
# 在类中使用保护属性
print(f'B: {self._b}')
# 在类中使用保护权限的方法
self._display()

# 保护权限的方法
def _display(self):
print(f'B: {self._b}')


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外无法使用保护权限的属性(不建议这样使用)
print(obj._b)
# 在类外使用公有方法
obj.show()
# 在类外无法使用保护权限的方法(不建议这样使用)
obj._display()

_ _ 双下划线前缀(私有属性)

Python 在类中使用 双下划线前缀 实现其它语言中 private 私有权限的功能,在属性或方法(包括类属性和类方法,作用相同)前添加一个双下划线,该属性或方法,只能在当前类中可以访问,

在类外任何位置不可访问(只是理论上不可访问,通过某些方式,还是可以在类外访问,不建议这样使用)。

class A(object):
def __init__(self):
# 公有属性
self.a = 10
# 保护属性
self._b = 20
# 私有属性
self.__c = 30

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')
# 在类中使用保护属性
print(f'B: {self._b}')
# 在类中使用私有属性
print(f'C: {self.__c}')
# 在类中使用保护权限的方法
self._display()
# 在类中使用私有方法
self.__info()

# 保护权限的方法
def _display(self):
print(f'B: {self._b}')

# 私有权限的方法
def __info(self):
# 在类中使用私有属性
print(self.__c)


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外无法使用保护权限的属性(不建议这样使用)
print(obj._b)
# 在类外使用私有属性,访问失败
# print(obj.__c)
# 在类外使用公有方法
obj.show()
# 在类外无法使用保护权限的方法(不建议这样使用)
obj._display()
# 在类外访问私有方法,访问失败
# obj.__info()

双下划线前缀与后缀

在 Python 中还有一种同时具有前后双下划线的变量或方法,这些方法是 Python 中的魔法属性或魔法方法,这些属性或方法名被赋予了特殊的作用,比如:初始化方法 __init__(), 对象描述方法 __str__(), 还有 __iter__()__next__() 方法等,这些都是魔法方法。