无意中从基类调用ovverriden方法__init__

时间:2016-01-21 21:31:52

标签: python python-3.x

这个程序似乎完成了本书的所有内容,但是这个问题出现了:当一个基类被初始化时,调用了一个在派生类中被覆盖的成员方法,并假设派生类已经被建造。

是否有一些最佳做法可以防止这种情况发生?

.htaccess

这就是错误:

#!/usr/bin/env python3

class A:
    def __init__(self):
        self.ax = 1
        print(self)

    def __repr__(self):
        return "{} ax: {}".format(self.__class__.__name__, self.ax)


class B(A):
    def __init__(self):
        super().__init__()
        self.bx = 10

    def __repr__(self):
        return super().__repr__() + " bx: {}".format(self.bx)


if __name__ == "__main__":
    B()

2 个答案:

答案 0 :(得分:1)

通常,除非你真的知道自己在做什么,否则你需要在完成类所需的所有操作后调用超类初始化。与此示例相同, repr 正在尝试在初始化之前打印self.bx。如果你这样做

class B(A):
    def __init__(self):
        self.bx = 10
        super().__init__()

    def __repr__(self):
        return super().__repr__() + " bx: {}".format(self.bx)

按预期工作

答案 1 :(得分:0)

编辑:

不是在__init__上进行计算,而是在工厂函数/类方法中做一个想法。

示例而不是:

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.initialize()

    def initialize(self):
        # do some things

执行:

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @classmethod
    def from_a_b(cls, a, b):
        instance = cls(a, b)
        instance.initialize()
        return instance