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 đó Dog
là 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 User
mô hình bao gồm UserService
và 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 User
mô 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ì
User
thừa kế từ, hoặc bao gồm,UserService
vàLoggingService
nó 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_credentials
chú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 đầuUserService
và 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?