我想了解super()
的工作原理。我明白它的作用,但我不明白幕後發生的事情的機制。有一兩件事我完全不明白之間的區別在於:super()在方法開始或結束時被調用有什麼區別?
class b(a):
def __init__(self, name, age):
self.name=name
self.age=age
super(b, self).__init__(name, age)
和:
class b(a):
def __init__(self, name, age):
super(b, self).__init__(name, age)
self.name=name
self.age=age
也許有在這兩個例子中沒有什麼區別,但我知道有其他情況下的位置super()
重要。例如,這個Django方法我需要幫助,我被指示將super()
移到if語句之上,而不是在底部。我想知道爲什麼這很重要。
class Mymodel(models.Model):
photo = models.ImageField(upload_to="...", blank=True)
def save(self, *args, **kwargs):
image_resized = kwargs.pop('image_resized',False)
super(Mymodel, self).save(*args, **kwargs)
if self.photo and image_resized:
basewidth = 300
filename = self.get_source_filename()
image = Image.open(filename)
wpercent = (basewidth/float(image.size[0]))
hsize = int((float(image.size[1])*float(wpercent)))
img = image.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
self.photo = img
self.save(image_resized = True)
想一想;如果你的代碼依賴於只在超類'__init__'中初始化的實例屬性呢?你越早打電話就越好。另外,這是'超級'。 – jonrsharpe
儘管如此,有些情況下你想最後調用它。就像'__new__'一樣。 –
它只是一個方法調用**,儘管只有一個方法可以在父類中找到。但是*當你調用它時與調用其他方法具有相同的影響。東西發生。如果你不叫它,那東西就不會發生。 –