如何在不破坏数据封装的情况下访问父 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++ 代码示例中所有 方法 被声明为 public
或 protected
(从不作为 private
)并且所有 属性 被声明为 private
(从不如 public
或 protected
).
在第一种情况下,我假设作者使用 protected
方法而不是 private
方法来允许实现继承(subclasses 可以委托给它们)。
在第二种情况下,虽然我知道避免使用 public
和 protected
属性可以防止破坏数据封装,如果子 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
在 Design Patterns: Elements of Reusable Object-Oriented Software "Gang of Four" 的 1994 年一书中,我注意到在 C++ 代码示例中所有 方法 被声明为 public
或 protected
(从不作为 private
)并且所有 属性 被声明为 private
(从不如 public
或 protected
).
在第一种情况下,我假设作者使用 protected
方法而不是 private
方法来允许实现继承(subclasses 可以委托给它们)。
在第二种情况下,虽然我知道避免使用 public
和 protected
属性可以防止破坏数据封装,如果子 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