【问题标题】:How to override attributes in subclass, but maintain methods of super class in python2.7?python2.7如何覆盖子类中的属性,但维护超类的方法?
【发布时间】:2019-05-16 08:03:10
【问题描述】:

我想在我的子类中继承一个属性,但我想从超类中调用一个方法。

然而,为了从父级继承属性,我需要调用super。但是当我在上面调用super 时,它会赋予它来自超类的属性,而不是来自子类的属性。如何确保它获得我在定义子类时分配给它的属性?

class SuperClass2(object):
    def __init__(self, passed_in):
        self.attribute = 4
        self.passed_in = passed_in
        self.shared_method()

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        self.attribute = 3  # i set attribute to 3 here
        self.passed_in = passed_in
        super(SubClass2, self).__init__(passed_in)  # I already set attribute to 3 ....but gets overwritten when I call super

在上面的示例中,child=SubClass2(3) 产生 AssertionError: sorry they are not equal

正如您在上面的示例中看到的那样,通过将其设置为等于 3 将不允许我使用该属性。如何覆盖子类中的属性,但维护超类的方法?

【问题讨论】:

  • 在超类中:self.attribute = getattr(self, attribute, None) 或 4。如果它被设置在子类中,它不会改变它,否则它设置为 4。对于像 0 这样的虚假值可能会有点棘手。
  • 先调用 super().__init__。

标签: python python-2.7 oop


【解决方案1】:

方法一

很明显是先调用super(),然后修改属性

class SubClass2(SuperClass2):
  def __init__(self, passed_in):
    super(SubClass2, self).__init__(passed_in)
    self.attribute = 3  # i set attribute to 3 here
    self.passed_in = passed_in

方法二

总是将这样的公共属性委托给超类,所以它会是这样的:

class SuperClass2(object):
    def __init__(self, passed_in, attribute=4):
        self.attribute = attribute
        self.passed_in = passed_in
        self.shared_method()

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        super(SubClass2, self).__init__(passed_in=passed_in, attribute=3) 

方法3

将初始化委托给单独的方法,然后在子类中覆盖该方法

class SuperClass2(object):
    def __init__(self, passed_in):
        self._init(passed_in)
        self.shared_method()

    def _init(passed_in):
        self.attribute = 4
        self.passed_in = passed_in

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        super(SubClass2, self).__init__(passed_in=passed_in) 

    def _init(passed_in):
        self.attribute = 3
        self.passed_in = passed_in

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2015-10-14
    相关资源
    最近更新 更多