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

Python子类继承父类的属性与方法:是否存在例外情况?

Python子类继承的属性与方法详解

针对你写的这段代码:

class A_subclass(The_superclass):
    pass

默认情况下,子类A_subclass会继承父类The_superclass的绝大多数属性和方法,但不是所有,存在几个关键例外:

  • 双下划线开头的私有属性/方法:Python会对这类名称做「名称修饰」处理,子类无法直接通过原名称访问。比如父类里的__private_attr或__private_method,子类不能直接用self.__private_attr调用,只能通过_The_superclass__private_attr这种修饰后的名称访问(但这种写法违背封装设计,不推荐使用)。

    举个实际例子:

    class The_superclass:
        def __init__(self):
            self.public_data = "我是公开属性"
            self.__secret_data = "我是私有属性"
        
        def public_func(self):
            return "我是公开方法"
        
        def __secret_func(self):
            return "我是私有方法"
    
    class A_subclass(The_superclass):
        def check_parent(self):
            print(self.public_data)  # 正常输出
            print(self.public_func())  # 正常输出
            # print(self.__secret_data)  # 直接调用会触发AttributeError
            # print(self.__secret_func())  # 直接调用会触发AttributeError
            # 强制访问修饰后的名称(不推荐)
            print(self._The_superclass__secret_data)
            print(self._The_superclass__secret_func())
    
  • 被子类覆盖的特殊方法:如果子类定义了和父类同名的特殊方法(比如__init__、__str__),父类的对应方法就不会被自动使用,除非你在子类里显式通过super()调用父类版本。

    比如:

    class The_superclass:
        def __init__(self):
            self.num = 20
    
    class A_subclass(The_superclass):
        def __init__(self):
            # 没调用super().__init__的话,父类的初始化逻辑不会执行
            self.new_num = 30
    
    obj = A_subclass()
    # print(obj.num)  # 会触发AttributeError,因为父类的num没被初始化
    
  • 父类的__slots__限制:如果父类用__slots__定义了允许的属性列表,子类默认不会继承这个限制(子类可以随意添加新属性)。只有当子类自己也定义了__slots__时,才会继承父类的__slots__规则,此时子类的属性范围是自己的__slots__加上父类的。

回到你的代码,因为A_subclass没有定义任何内容,它会完整继承父类所有非私有属性和方法,私有属性/方法虽然存在但无法直接访问。

内容的提问来源于stack exchange,提问作者Kevin Njuguna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:50:23