Python, không giống như các ngôn ngữ gõ tĩnh như Java, cho phép hoàn toàn tự do khi gọi các phương thức trong quá trình khởi tạo đối tượng. Tuy nhiên, các nguyên tắc hướng đối tượng tiêu chuẩn áp dụng cho các lớp Python sử dụng hệ thống phân cấp kế thừa sâu. Do đó, nhà phát triển có trách nhiệm đảm bảo rằng các đối tượng được khởi tạo đúng cách khi có nhiều phương thức
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 cần được gọi
Gọi một phương thức
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 nhiều lần trong quá trình khởi tạo đối tượng có nguy cơ đối tượng được khởi tạo không chính xác. Không chắc rằng phương pháp
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 có liên quan được thiết kế để được gọi nhiều lần
Có một số cách mà một phương thức
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 có thể được gọi nhiều lần
Có thể có nhiều hơn một lệnh gọi rõ ràng đến phương thức trong hệ thống phân cấp của 10 phương thức
Một lớp sử dụng nhiều kế thừa gọi trực tiếp các phương thức
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass
0 của các kiểu cơ sở của nó. Một hoặc nhiều loại cơ sở đó sử dụng#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass
0 để truyền chuỗi thừa kế
Sự giới thiệu¶
Hãy cẩn thận để không gọi một phương thức
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 một cách rõ ràng nhiều lần hoặc sử dụng
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 trong toàn bộ hệ thống phân cấp thừa kế
Ngoài ra, cấu trúc lại một hoặc nhiều lớp để sử dụng thành phần thay vì kế thừa
Thí dụ¶
Trong ví dụ đầu tiên, các cuộc gọi rõ ràng tới
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 được sử dụng, nhưng
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass4 gọi nhầm cả hai
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass5 và
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass6. Điều này có thể được khắc phục bằng cách loại bỏ cuộc gọi đến
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass5, như được hiển thị trong
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass8
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass
Trong ví dụ thứ hai, có sự kết hợp giữa các lệnh gọi rõ ràng tới
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 và các lệnh gọi sử dụng
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0. Để khắc phục ví dụ này, nên sử dụng
#Calling a method multiple times by using explicit calls when a base inherits from other base class Vehicle[object]: def __init__[self]: self.mobile = True class Car[Vehicle]: def __init__[self]: Vehicle.__init__[self] self.car_init[] def car_init[self]: pass class SportsCar[Car, Vehicle]: # Vehicle.__init__ will get called twice def __init__[self]: Vehicle.__init__[self] Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass #Fix SportsCar by only calling Car.__init__ class FixedSportsCar[Car, Vehicle]: def __init__[self]: Car.__init__[self] self.sports_car_init[] def sports_car_init[self]: pass0 xuyên suốt