python面向对象编程:访问限制
在Python面向对象编程中,访问限制是一个重要的概念,用于控制类的属性和方法在不同作用域下的可见性和可访问性。Python主要通过命名约定和内置机制来实现访问限制。
命名约定
Python没有严格的访问控制关键字(如C++中的private
和protected
),而是通过命名约定来实现访问限制。主要的命名约定包括:
- 单下划线前缀 (
_
):- 表示“受保护的”或“内部使用的”属性或方法。虽然从技术上讲仍然可以访问,但通常不建议外部代码直接访问这些成员。
- 双下划线前缀 (
__
):- 表示名称改写(Name Mangling)。Python会将这样的属性名改写为
_类名__属性名
,从而避免子类意外覆盖父类的属性。
- 表示名称改写(Name Mangling)。Python会将这样的属性名改写为
- 无前缀:
- 没有前缀的属性或方法是公开的,可以在类的外部直接访问。
示例代码
以下是一个包含上述命名约定的示例类:
python复制代码
class MyClass: | |
def __init__(self, public_var, _protected_var, __private_var): | |
self.public_var = public_var | |
self._protected_var = _protected_var | |
self.__private_var = __private_var | |
def public_method(self): | |
print(f"Public Variable: {self.public_var}") | |
print(f"Protected Variable: {self._protected_var}") | |
print(f"Private Variable: {self.__private_var}") | |
def _protected_method(self): | |
print("This is a protected method.") | |
def __private_method(self): | |
print("This is a private method.") | |
# 创建对象 | |
obj = MyClass(10, 20, 30) | |
# 访问公开成员 | |
print(obj.public_var) # 10 | |
obj.public_method() | |
# 访问受保护成员(虽然可以访问,但不推荐) | |
print(obj._protected_var) # 20 | |
# obj._protected_method() # 可以调用,但不推荐 | |
# 尝试访问私有成员(会引发AttributeError) | |
# print(obj.__private_var) # AttributeError: 'MyClass' object has no attribute '__private_var' | |
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method' | |
# 但是可以通过名称改写访问私有成员(不推荐) | |
print(obj._MyClass__private_var) # 30 | |
obj._MyClass__private_method() # This is a private method. |
注意
- 名称改写:
- 使用双下划线前缀的变量名会被Python改写,从而避免子类覆盖。但这也使得通过改写后的名称访问私有变量成为可能。
- 约定优于配置:
- Python的访问限制主要依赖于命名约定,而不是强制性的语法规则。因此,遵循这些约定对于维护代码的可读性和可维护性非常重要。
- 属性封装:
- 如果需要更严格的访问控制,可以使用getter和setter方法来封装属性。
使用getter和setter方法
通过getter和setter方法,可以更好地控制属性的访问和修改:
python复制代码
class MyClass: | |
def __init__(self, public_var, protected_var, private_var): | |
self._public_var = public_var | |
self._protected_var = protected_var | |
self.__private_var = private_var | |
@property | |
def public_var(self): | |
return self._public_var | |
@public_var.setter | |
def public_var(self, value): | |
self._public_var = value | |
def _get_protected_var(self): | |
return self._protected_var | |
def _set_protected_var(self, value): | |
self._protected_var = value | |
def __get_private_var(self): | |
return self.__private_var | |
def __set_private_var(self, value): | |
self.__private_var = value | |
# 创建对象 | |
obj = MyClass(10, 20, 30) | |
# 访问和修改公开属性 | |
print(obj.public_var) # 10 | |
obj.public_var = 40 | |
print(obj.public_var) # 40 | |
# 访问和修改受保护属性(不推荐直接访问) | |
# print(obj._get_protected_var()) # 20 | |
# obj._set_protected_var(50) # 不推荐直接修改 | |
# 访问和修改私有属性(不推荐直接访问) | |
# print(obj.__get_private_var()) # 30 | |
# obj.__set_private_var(60) # 不推荐直接修改 |
通过上述方法,可以更好地控制属性的访问和修改,虽然Python没有强制的访问控制机制,但良好的约定和封装实践可以帮助编写更健壮和可维护的代码。
原文地址:https://blog.csdn.net/2301_78045723/article/details/144378957
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!