本人实际测试了Python 3.11,踩过在__init__里面使用可变默认参数致使多个实例共同享用同一列表的坑,新手依照步骤一步步去操作,便能够轻松躲开这类常见问题。 步骤1 定……
本人实际测试了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()来动态性地创建类。你在编写代码期间,还碰到过什么样的关于类创建的极为罕见的报错呢?欢迎在评论区域分享你遭遇问题的经历。
微信扫一扫
还没有评论呢,快来抢沙发~