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

时间:2019-06-06 20:23:14

标签: oop subclass encapsulation protected

在1994年的《四人帮》一书中, Design Patterns: Elements of Reusable Object-Oriented Software 中,我注意到在C ++代码示例中,所有方法都声明为{{ 1}}或protected(从不作为private),并且所有属性都被声明为private(从不被称为public或{{1} }。

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

在第二种情况下,虽然我知道避免使用privatepublic属性可以防止破坏数据封装,但是如果子类需要访问父类属性,如何不使用它们呢? / strong>

例如,如果protected属性为AttributeError而不是get_salary(),则以下Python代码将在_age方法调用中引发private,也就是说它是否命名为protected

__age

1 个答案:

答案 0 :(得分:0)

我终于找到了一个显而易见的解决方案:在子类中重新声明父类的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