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
相关产品推荐
相关产品推荐

