面试题答案
一键面试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
方法)来减少这种动态特性带来的风险。