Python子类中添加变量:是否应使用__init__方法定义变量?
关于Python子类中实例变量定义方式的疑问
我正在学习Python类,现有如下代码案例:
class parent: def __init__(self): self.a = 1 self.b = 2 def printFoo(self): print(self.a) class child(parent): def createC(self, val): # Create a variable inside the derived class? self.c = val def printFoo(self): # overloaded function print(self.c) a = parent() b = child() b.createC(3) b.printFoo() # Edited: # I can even create variables as: child.d = 10
我希望在child类中定义变量c并存储,目前通过createC方法实现,还能直接以child.d = 10的方式创建变量。请问这样做是否合适?是否应该定义__init__方法来创建该变量?
三种方式的分析与建议
通过
createC方法赋值
这种方式存在明显隐患:如果在调用printFoo之前没调用createC,程序会抛出AttributeError,因为self.c还未定义。如果c是实例必须具备的属性,不建议用这种方式;如果c是可选属性,使用时要先判断属性是否存在,比如在printFoo里加if hasattr(self, 'c'):的判断。直接给类赋值
child.d = 10
这是定义类变量,而非实例变量。所有child的实例都会共享这个d的值,修改child.d会影响所有实例;只有当某个实例给self.d赋值时,才会创建该实例独有的d属性。如果你的需求是每个实例拥有独立的d,这种方式完全错误;仅当需要所有实例共享某个状态或常量时,才适合用类变量。在子类
__init__中定义
这是最规范的推荐做法。在子类构造方法里初始化c,能保证实例创建时就具备该属性,避免属性不存在的报错,同时让类的结构更清晰,其他开发者一眼就能知道类的属性清单。注意要调用父类的__init__方法,确保父类的属性也被正确初始化。
修改后的示例代码:
class parent: def __init__(self): self.a = 1 self.b = 2 def printFoo(self): print(self.a) class child(parent): def __init__(self): super().__init__() # 调用父类构造方法 self.c = None # 初始化c,可设置默认值 def setC(self, val): # 保留方法用于修改c的值 self.c = val def printFoo(self): print(self.c) a = parent() b = child() b.setC(3) b.printFoo()
内容的提问来源于stack exchange,提问作者user19749645
相关产品推荐
相关产品推荐

