
本文讲解如何通过关键字参数(**kwargs)机制,让子类在初始化时既能继承父类的默认属性值,又能灵活传入自定义值,避免因位置参数误用导致的 TypeError。
本文讲解如何通过关键字参数(`**kwargs`)机制,让子类在初始化时既能继承父类的默认属性值,又能灵活传入自定义值,避免因位置参数误用导致的 `typeerror`。
在 Python 面向对象编程中,当子类需要复用父类的初始化逻辑并保留其默认参数值时,必须确保参数传递方式与父类 __init__ 的签名严格匹配。你遇到的错误:
TypeError: Employe.__init__() takes from 1 to 2 positional arguments but 4 were given
根本原因在于:Employe('a', 'b', 'c') 尝试以位置参数形式传入三个值,但 Employe.__init__ 仅声明了两个形参 —— self 和 position(**kwargs 不接收位置参数),因此前两个参数被分别绑定到 self 和 position,第三个及之后的参数无处安放,直接报错。
✅ 正确做法是:显式使用关键字参数(keyword arguments)传值,使 **kwargs 能准确捕获并转发给父类:
class Person:
def __init__(self, name="Duck", age=2):
self.__name = name
self.__age = age
def person_info(self):
print(f"I'm {self.__name} and {self.__age} y.o.")
class Employee(Person): # 建议修正拼写:Employe → Employee
def __init__(self, position="boss", **kwargs):
super().__init__(**kwargs) # ✅ kwargs 自动解包为 name=..., age=... 形式
self.position = position
def employee_info(self):
print(self.position)✅ 使用示例(全部合法):
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
# 仅覆盖部分参数,其余使用父类默认值
emp1 = Employee("Engineer", name="Alice") # age=2(默认)
emp2 = Employee("Manager", age=35) # name="Duck"(默认)
emp3 = Employee("CTO", name="Bob", age=42) # 全部显式指定
emp4 = Employee("Intern") # name="Duck", age=2(全默认)
emp1.person_info() # I'm Alice and 2 y.o.
emp2.person_info() # I'm Duck and 35 y.o.
emp3.person_info() # I'm Bob and 42 y.o.
emp4.person_info() # I'm Duck and 2 y.o.⚠️ 注意事项:
- ❌ 不要写
Employee('a', 'b', 'c')—— 这是位置参数,**kwargs无法接收; - ✅ 必须写
Employee(position='a', name='b', age='c')或至少Employee('a', name='b')(position是首个位置参数,其余必须为关键字); - ? 父类使用双下划线
__name/__age触发名称改写(name mangling),虽增强封装性,但也意味着子类无法直接访问self.__name;如需扩展行为,建议改用单下划线_name或@property; - ? 若未来需支持更多父类参数,无需修改子类
__init__——**kwargs天然兼容扩展。
总结:**kwargs 是实现“可选参数继承”的关键桥梁,但其前提是调用端必须遵循关键字传参约定。这是 Python 中组合优于硬编码、灵活性源于显式设计的典型实践。

















