MST

星途 面试题库

面试题:Python属性访问控制在继承场景下的表现

假设有一个基类A具有受保护属性,有一个子类B继承自A。请阐述在子类B中对基类A的受保护属性的访问规则,并举例说明如何在子类中正确地扩展对这些属性的访问控制逻辑,同时要考虑Python的动态特性对属性访问控制可能带来的影响。
40.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 访问规则

在Python中,基类A的受保护属性(命名以单下划线开头,如_attr),在子类B中是可以访问的。受保护属性的初衷是表示这些属性不应该在类外部直接访问,但在子类内部是被允许访问和操作的。

2. 示例代码

class A:
    def __init__(self):
        self._protected_attr = 10

class B(A):
    def access_protected(self):
        return self._protected_attr

    def modify_protected(self, new_value):
        if isinstance(new_value, int) and new_value > 0:
            self._protected_attr = new_value
        else:
            raise ValueError("新值必须是正整数")


b = B()
print(b.access_protected())  # 输出: 10
b.modify_protected(20)
print(b.access_protected())  # 输出: 20

在上述代码中,子类B通过access_protected方法访问基类A的受保护属性_protected_attr,并通过modify_protected方法扩展了对该属性的访问控制逻辑,只有在传入正整数时才允许修改。

3. Python动态特性的影响

Python的动态特性允许在运行时动态地添加、修改和删除对象的属性。这意味着即使一个属性被定义为受保护的,仍然可以在类外部通过对象实例动态地访问和修改。例如:

b = B()
print(b._protected_attr)  # 虽然不推荐,但仍可访问
b._protected_attr = 30
print(b.access_protected())  # 输出: 30

这种动态特性可能会破坏受保护属性原本的访问控制意图。因此,在实际开发中,开发者需要自觉遵循约定,避免在类外部直接访问受保护属性,以维护代码的封装性和可维护性。同时,也可以通过在子类中定义更严格的访问控制方法(如上述modify_protected方法)来减少这种动态特性带来的风险。