### [类创建三步走:新手必踩3个坑及解法](https://2632.net/courses/2100003660.html) **Published:** 2026-04-17T02:05:25 **Author:** 智行者IC社区 **Excerpt:** 本人实际测试了Python 3.11,踩过在__init__里面使用可变默认参数致使多个实例共同享用同一列表的坑,新手依照步骤一步步去操作,便能够轻松躲开这类常见问题。 本人实际测试了[Python](/doc/3555.html "Python") 3.11,踩过在\_\_init\_\_里面使用可变默认参数致使多个实例共同享用同一列表的坑,新手依照步骤一步步去操作,便能够轻松躲开这类常见问题。 ## 步骤1 定义类名与父类继承 于PyCharm里新建demo.py,键入class ChildClass(ParentClass): ,要是不需要继承父类的话那么括号就留空。有固定参数:类名的首字母要大写,括号里面直接写上父类名比如object。 **【新手避坑】** 经常出现的报错是NameError: name ‘ParentClass’ is not defined,其缘由在于父类没有提前进行定义或者导入,解决的方式是:检查父类在拼写方面是否正确,或者在文件的顶部采用from module import ParentClass这样的形式进行导入。 ## 步骤2 编写\_\_init\_\_初始化方法 于类定义的内部,进行缩进4空格的操作,输入def \_\_init\_\_(self, name, items=None):。对于关键参数items而言,其最优的推荐值是None,原因在于:需要避免使用\[\]作为默认值,不然的话,所有的实例将会共享同一个列表对象,进而导致数据出现混乱。 **【新手避坑】** 报错为TypeError: \_\_init\_\_()缺少1个必需的位置参数,其核心的缘由在于在进行实例化操作之际忘记传递参数了。要迅速解决此问题,就要去检查类名(参数)是不是已经配备齐全了\_\_init\_\_当中除self之外的所有必须填写的参数。 ## 步骤3 添加普通方法并实例化 于\_\_init\_\_的下面持续去定义def show(self):,在该方法之内运用self.属性来访问数据。操作的路径是:将光标移动到文件的末尾处,输入obj = 类名(参数值),接着调用obj.show()。 **两种方案对比** 方案A:通过手动去定义双下划线init,在这种方式下,能够灵活地对每个参数加以控制,此方案适合那种具备复杂业务逻辑的情况。 运用@dataclass的方案B:它能够自动生成\_\_init\_\_,其代码量较少,适用于纯粹的数据容器。 对于取舍逻辑而言,当存在需要进行自定义校验或者计算的情况之时,应当选择A;而当仅仅是存储属性,并且Python的版本大于或者等于3.7的时候,则应当选择B。 **高频完整报错一站式解决** 原因:在方法里使用了未在`__init__`中定义的属性。 解决流程是这样的,首先,回到\_\_init\_\_添加self.xxx = 默认值,接着,检查方法中属性名拼写,最后,重新运行代码。 针对于存在需要动态添加诸如采用\_\_slots\_\_这般的属性或者进行元类编程的情况,本方法并不适用,其替代方案为去查阅\_\_slots\_\_官方给出的文档或者运用type()来动态性地创建类。你在编写代码期间,还碰到过什么样的关于类创建的极为罕见的报错呢?欢迎在评论区域分享你遭遇问题的经历。 **Categories:** 技术文档 ---