Cho rằng Python cho phép nhiều kế thừa, thừa kế thành ngữ trong Python trông như thế nào?
Trong các ngôn ngữ có tính kế thừa duy nhất, như Java, tính kế thừa sẽ được sử dụng khi bạn có thể nói rằng một đối tượng "là-a" của một đối tượng khác và bạn muốn chia sẻ mã giữa các đối tượng (từ đối tượng cha sang đối tượng con). Ví dụ: bạn có thể nói đó Doglà Animal:
public class Animal {...}
public class Dog extends Animal {...}
Nhưng vì Python hỗ trợ nhiều kế thừa, chúng ta có thể tạo một đối tượng bằng cách kết hợp nhiều đối tượng khác lại với nhau. Hãy xem xét ví dụ dưới đây:
class UserService(object):
def validate_credentials(self, username, password):
# validate the user credentials are correct
pass
class LoggingService(object):
def log_error(self, error):
# log an error
pass
class User(UserService, LoggingService):
def __init__(self, username, password):
self.username = username
self.password = password
def authenticate(self):
if not super().validate_credentials(self.username, self.password):
super().log_error('Invalid credentials supplied')
return False
return True
Đây có phải là một sự chấp nhận hay sử dụng tốt của nhiều kế thừa trong Python? Thay vì nói thừa kế là khi một đối tượng "là-a" của một đối tượng khác, chúng ta tạo một Usermô hình bao gồm UserServicevà LoggingService.
Tất cả logic cho cơ sở dữ liệu hoặc hoạt động mạng có thể được tách biệt khỏi Usermô hình bằng cách đặt chúng vào UserServiceđối tượng và giữ tất cả logic để đăng nhập LoggingService.
Tôi thấy một số vấn đề với phương pháp này là:
- Điều này có tạo ra một đối tượng Thiên Chúa? Vì
Userthừa kế từ, hoặc bao gồm,UserServicevàLoggingServicenó có thực sự tuân theo nguyên tắc trách nhiệm đơn lẻ không? - Để truy cập các phương thức trên một đối tượng cha / dòng tiếp theo (ví dụ:
UserService.validate_credentialschúng ta phải sử dụngsuper. Điều này làm cho khó khăn hơn một chút để xem đối tượng nào sẽ xử lý phương thức này và không rõ ràng như, nói , bắt đầuUserServicevà làm một cái gì đó nhưself.user_service.validate_credentials
Điều gì sẽ là cách Pythonic để thực hiện mã trên?