Python中如何在子类中基于父类属性重写同名属性
Python中如何在子类中基于父类属性重写同名属性
嘿,这个问题我碰到过好多次啦,咱们来捋清楚怎么解决~
你原来的代码之所以报错,是因为在定义类属性的时候,self还不存在——self是类实例化之后才会有的对象引用,所以直接在类属性里用self肯定行不通。下面给你几种靠谱的解决方法:
方法一:直接引用父类的类属性
因为父类的attribute是类属性,你可以直接通过父类名称来访问它,然后计算子类的属性值:
class Parent: attribute = 5 class Child(Parent): attribute = Parent.attribute / 2
这样子类的Child.attribute就会被设为父类属性的一半,也就是2.5,完美解决问题~
方法二:用super()来访问父类属性(更灵活)
如果你担心以后修改父类名称,或者想让代码更健壮,可以用super()来指向父类:
class Parent: attribute = 5 class Child(Parent): attribute = super().attribute / 2
Python 3里支持在类定义中直接使用super(),它会自动找到当前类的父类,这样就算以后父类改名了,子类的代码也不用跟着改,非常方便。
方法三:如果是实例属性的情况
要是你其实想让attribute是每个实例独有的属性(而不是类属性),那就要在__init__方法里处理:
class Parent: def __init__(self): self.attribute = 5 class Child(Parent): def __init__(self): super().__init__() # 先调用父类的初始化方法,给实例设置attribute self.attribute = self.attribute / 2
这种方式会先让父类完成实例属性的初始化,再把子类实例的attribute改成父类值的一半,每个实例都会有自己的属性值。
备注:内容来源于stack exchange,提问作者Preetam Pal
相关产品推荐
相关产品推荐

