Python中访问__init__内私有变量及Doctor子类重写details()方法报错解决
问题解答
1. 如何访问Python __init__函数中定义的私有变量?
Python中双下划线开头的变量是名称修饰后的“私有”变量,并非严格意义上的私有,有两种访问方式:
推荐方式:通过类的公共方法访问
在类内部定义getter这类公共方法,通过这些方法获取私有变量值,符合面向对象的封装原则:class Member: def __init__(self, id, name): self.__id = id self.__name = name def get_id(self): return self.__id def get_name(self): return self.__name m = Member(1, "Alice") print(m.get_id()) # 输出 1 print(m.get_name()) # 输出 Alice不推荐方式:直接访问修饰后的变量名
Python会将__变量名自动修饰为_类名__变量名,可以通过这个修饰后的名称直接访问,但这种方式破坏了类的封装性,不建议在生产代码中使用:m = Member(1, "Alice") print(m._Member__id) # 输出 1 print(m._Member__name) # 输出 Alice
2. 修复Doctor子类details()方法的报错问题
报错原因
- 子类无法直接访问父类的
__id、__name:父类的双下划线变量会被Python自动修饰为_Member__id和_Member__name,子类直接写self.__id会触发AttributeError。 - 变量名不匹配:Doctor类初始化时定义的是
self.__drNumber,但details方法中错误使用了self.__regNo,导致找不到该变量。
修复后的代码
class Member: def __init__(self, id, name): self.__id = id self.__name = name def details(self): return self.__id, self.__name class Doctor(Member): def __init__(self, id, name, drNumber): super().__init__(id, name) self.__drNumber = drNumber # 保持变量名一致 def details(self): # 调用父类的details方法获取id和name,再拼接自身的drNumber(推荐) member_details = super().details() return member_details + (self.__drNumber,) doc = Doctor(1123, "Tim", "xxx5678") print(doc.details()) # 输出 (1123, 'Tim', 'xxx5678')
补充说明
如果不想调用父类方法,也可以通过修饰后的变量名访问父类私有变量,但这种方式耦合性高,不推荐:
def details(self): return self._Member__id, self._Member__name, self.__drNumber
内容的提问来源于stack exchange,提问作者Kaushika
相关产品推荐
相关产品推荐

