You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法的报错问题

报错原因

  1. 子类无法直接访问父类的__id、__name:父类的双下划线变量会被Python自动修饰为_Member__id和_Member__name,子类直接写self.__id会触发AttributeError。
  2. 变量名不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:09:55