Python中如何初始化自定义类类型的默认空列表成员变量
错误原因
MyClass构造方法内的my_strings未加self.前缀,属于局部变量,没有绑定到实例对象上,因此实例的my_strings成员还是初始定义的NoneList[MyBaseClass]是类型注解语法,仅用于标注变量的类型约束,不会实际生成列表实例,需要手动调用[]或list()创建空列表- 原代码中
MyClass没有定义append方法,直接调用会触发属性不存在的错误
正确实现代码
首先引入类型标注依赖,修正类定义:
from typing import List class MyBaseClass(object): string_a: str string_b: str def __init__(self): self.string_a = str() self.string_b = str() class MyClass(object): # 类型标注:my_strings是元素为MyBaseClass类型的列表 my_strings: List[MyBaseClass] def __init__(self): # 实例化空列表,绑定到实例成员 self.my_strings = [] # 实现追加方法,接收字符串参数构造MyBaseClass实例后加入列表 def append(self, a: str, b: str) -> None: new_item = MyBaseClass() new_item.string_a = a new_item.string_b = b self.my_strings.append(new_item)
验证运行
my_class = MyClass() # 此时my_class.my_strings为长度为0的空列表,不会触发None错误 my_class.append("hello", "world") # 输出验证结果 print(len(my_class.my_strings)) # 输出1 print(my_class.my_strings[0].string_a) # 输出hello
优化建议
可以给MyBaseClass的构造方法增加初始化参数,简化赋值逻辑:
class MyBaseClass(object): def __init__(self, a: str = "", b: str = ""): self.string_a = a self.string_b = b
对应的append方法可以简化为:
def append(self, a: str, b: str) -> None: self.my_strings.append(MyBaseClass(a, b))
内容的提问来源于stack exchange,提问作者cdub
相关产品推荐
相关产品推荐

