Trong bài nói chuyện của Raymond Hettinger "Super considered super speak" tại PyCon 2015, ông giải thích những lợi thế của việc sử dụng super
trong Python trong nhiều ngữ cảnh thừa kế. Đây là một trong những ví dụ mà Raymond sử dụng trong buổi nói chuyện:Python tự và siêu thừa kế nhiều
class DoughFactory(object):
def get_dough(self):
return 'insecticide treated wheat dough'
class Pizza(DoughFactory):
def order_pizza(self, *toppings):
print('Getting dough')
dough = super().get_dough()
print('Making pie with %s' % dough)
for topping in toppings:
print('Adding: %s' % topping)
class OrganicDoughFactory(DoughFactory):
def get_dough(self):
return 'pure untreated wheat dough'
class OrganicPizza(Pizza, OrganicDoughFactory):
pass
if __name__ == '__main__':
OrganicPizza().order_pizza('Sausage', 'Mushroom')
Ai đó trong khán giả asked Raymond về sự khác biệt của việc sử dụng self.get_dough()
thay super().get_dough()
. Tôi không hiểu rõ câu trả lời ngắn gọn của Raymond nhưng tôi đã mã hóa hai ví dụ này để thấy sự khác biệt. Kết quả là như nhau cho cả hai trường hợp:
Getting dough
Making pie with pure untreated wheat dough
Adding: Sausage
Adding: Mushroom
Nếu bạn thay đổi thứ tự lớp từ OrganicPizza(Pizza, OrganicDoughFactory)
để OrganicPizza(OrganicDoughFactory, Pizza)
sử dụng self.get_dough()
, bạn sẽ nhận được kết quả này:
Making pie with pure untreated wheat dough
Tuy nhiên nếu bạn sử dụng super().get_dough()
này là đầu ra:
Making pie with insecticide treated wheat dough
Tôi hiểu hành vi super()
như Raymond đã giải thích. Nhưng hành vi mong đợi của self
trong nhiều kịch bản thừa kế là gì?
những gì - pizza kế thừa từ một nhà máy * bột *? Mã này là lạ. – user2357112
'self' hoạt động giống như bất kỳ tham chiếu nào khác đối tượng. Nếu bạn làm 'p = OrganicPizza()', thì 'self.get_dough()' trong bất kỳ phương thức 'p' nào tương đương với' p.get_dough() ', bất kể ở đâu trong đồ thị kế thừa, sử dụng' self' xảy ra. Bạn có hiểu 'p.get_dough()' sẽ làm gì không? – user2357112
@ user2357112 tại sao lại lạ? Chỉ là một ví dụ đơn giản mà Raymond đề xuất trong bài nói chuyện của anh ấy. –