如何在不破坏数据封装的情况下访问父 class 属性?

How to access a parent class attribute without breaking data encapsulation?

Design Patterns: Elements of Reusable Object-Oriented Software "Gang of Four" 的 1994 年一书中,我注意到在 C++ 代码示例中所有 方法 被声明为 publicprotected(从不作为 private)并且所有 属性 被声明为 private(从不如 publicprotected).

在第一种情况下,我假设作者使用 protected 方法而不是 private 方法来允许实现继承(subclasses 可以委托给它们)。

在第二种情况下,虽然我知道避免使用 publicprotected 属性可以防止破坏数据封装,如果子 class 需要访问父 class 属性?

例如,如果 _age 属性是 private 而不是protected,也就是说如果命名为__age:

class Person:

    def __init__(self, age):
        self._age = age  # protected attribute


class Employee(Person):

    def get_salary(self):
        return 5000 * self._age


Employee(32).get_salary()  # 160000

我终于自己找到了一个明显的解决方案:在子class中重新声明父class的private属性:

class Person:

    def __init__(self, age):
        self.__age = age  # private attribute


class Employee(Person):

    def __init__(self, age):
        self.__age = age  # private attribute

    def get_salary(self):
        return 5000 * self.__age


Employee(32).get_salary()  # 160000