簡體   English   中英

如何重寫子類中的屬性,但在python2.7中維護超類的方法?

[英]How to override attributes in subclass, but maintain methods of super class in python2.7?

我想在子類中繼承一個屬性,但是我想從超類中調用一個方法。

為了從父級繼承屬性,我需要在其上調用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。如何覆蓋子類中的屬性,但如何維護超類的方法?

方法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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM