自学内容网 自学内容网

python面向对象编程:访问限制

在Python面向对象编程中,访问限制是一个重要的概念,用于控制类的属性和方法在不同作用域下的可见性和可访问性。Python主要通过命名约定和内置机制来实现访问限制。

命名约定

Python没有严格的访问控制关键字(如C++中的privateprotected),而是通过命名约定来实现访问限制。主要的命名约定包括:

  1. 单下划线前缀 (_)
    • 表示“受保护的”或“内部使用的”属性或方法。虽然从技术上讲仍然可以访问,但通常不建议外部代码直接访问这些成员。
  2. 双下划线前缀 (__)
    • 表示名称改写(Name Mangling)。Python会将这样的属性名改写为_类名__属性名,从而避免子类意外覆盖父类的属性。
  3. 无前缀
    • 没有前缀的属性或方法是公开的,可以在类的外部直接访问。

示例代码

以下是一个包含上述命名约定的示例类:

 

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.

注意

  1. 名称改写
    • 使用双下划线前缀的变量名会被Python改写,从而避免子类覆盖。但这也使得通过改写后的名称访问私有变量成为可能。
  2. 约定优于配置
    • Python的访问限制主要依赖于命名约定,而不是强制性的语法规则。因此,遵循这些约定对于维护代码的可读性和可维护性非常重要。
  3. 属性封装
    • 如果需要更严格的访问控制,可以使用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)!