面向对象编程——私有化属性
一.私有化属性的概念
1.概念:私有化属性是将一些原本公开的属性设置权限,只能小范围访问,其他地方访问不了。这样可以保证数据的安全性,同时提高代码的可维护性。
2.注意:(1)python并没有真正的私有化支持,但是可以使用下划线完成伪私有的效果。
(2)类属性(方法)和示例属性(方法)遵循相同的规则。
二.私有化属性的访问范围的划分
属性的访问范围一共有4个板块,分别是类内部访问,子类内部访问,模块内其他位置访问,跨模块访问。
1. 类内部访问
类内部访问是指在类的定义中直接访问属性。无论是公有、受保护还是私有属性,都可以在类内部被访问和修改。
class MyClass:
def __init__(self):
self.public_attr = "Public"
self._protected_attr = "Protected"
self.__private_attr = "Private"
def display(self):
print(self.public_attr) # 可以访问
print(self._protected_attr) # 可以访问
print(self.__private_attr) # 可以访问
结论:
-
公有属性:可以访问和修改。
-
受保护属性:可以访问和修改。
-
私有属性:可以访问和修改。
2. 子类内部访问
子类内部访问是指在子类中访问父类的属性。子类可以访问父类的公有和受保护属性,但不能直接访问私有属性(需要通过名称修饰)。
class Parent:
def __init__(self):
self.public_attr = "Public"
self._protected_attr = "Protected"
self.__private_attr = "Private"
class Child(Parent):
def display(self):
print(self.public_attr) # 可以访问
print(self._protected_attr) # 可以访问
# print(self.__private_attr) # 报错:AttributeError
print(self._Parent__private_attr) # 可以访问,但需要名称修饰
结论:
-
公有属性:可以访问和修改。
-
受保护属性:可以访问和修改。
-
私有属性:不能直接访问,但可以通过名称修饰访问。
3. 模块内其他位置访问
模块内其他位置访问是指在同一个模块中,但不在类或子类内部访问属性。这种访问方式通常用于类的实例化和属性操作。
# 在同一个模块中
obj = MyClass()
print(obj.public_attr) # 可以访问
print(obj._protected_attr) # 可以访问(不推荐)
# print(obj.__private_attr) # 报错:AttributeError
print(obj._MyClass__private_attr) # 可以访问,但需要名称修饰
结论:
-
公有属性:可以访问和修改。
-
受保护属性:可以访问和修改(不推荐)。
-
私有属性:不能直接访问,但可以通过名称修饰访问。
4. 跨模块访问
跨模块访问是指在不同的模块中访问某个类的属性。这种访问方式与模块内其他位置访问类似,但涉及模块的导入。
模块1 (module1.py):
class MyClass:
def __init__(self):
self.public_attr = "Public"
self._protected_attr = "Protected"
self.__private_attr = "Private"
模块2 (module2.py):
from module1 import MyClass
obj = MyClass()
print(obj.public_attr) # 可以访问
print(obj._protected_attr) # 可以访问(不推荐)
# print(obj.__private_attr) # 报错:AttributeError
print(obj._MyClass__private_attr) # 可以访问,但需要名称修饰
结论:
-
公有属性:可以访问和修改。
-
受保护属性:可以访问和修改(不推荐)。
-
私有属性:不能直接访问,但可以通过名称修饰访问。
总结:属性访问范围的四个板块
访问范围 | 公有属性 | 受保护属性 | 私有属性 |
---|---|---|---|
类内部访问 | 可以访问和修改 | 可以访问和修改 | 可以访问和修改 |
子类内部访问 | 可以访问和修改 | 可以访问和修改 | 不能直接访问,但可以通过名称修饰访问 |
模块内其他位置访问 | 可以访问和修改 | 可以访问和修改(不推荐) | 不能直接访问,但可以通过名称修饰访问 |
跨模块访问 | 可以访问和修改 | 可以访问和修改(不推荐) | 不能直接访问,但可以通过名称修饰访问 |
三.私有化属性中不同下滑线对应的效果
(1)没有下滑线——公有属性
(2)一个下划线——受保护属性
(3)两个下划线——私有属性