[英]Python2.7: infinite loop when super __init__ creates an instance of it's own subclass
[英]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.