Mengingat bahwa Python memungkinkan pewarisan berganda, seperti apa pewarisan idiomatik dalam Python?
Dalam bahasa dengan pewarisan tunggal, seperti Java, pewarisan akan digunakan ketika Anda bisa mengatakan bahwa satu objek "adalah-a" dari objek lain dan Anda ingin berbagi kode antara objek (dari objek induk ke objek anak). Misalnya, Anda dapat mengatakan bahwa Dogini adalah Animal:
public class Animal {...}
public class Dog extends Animal {...}
Tetapi karena Python mendukung banyak pewarisan, kita dapat membuat objek dengan menyusun banyak objek lain bersamaan. Perhatikan contoh di bawah ini:
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
Apakah ini merupakan pewarisan berganda dari Python yang dapat diterima atau digunakan dengan baik? Alih-alih mengatakan warisan adalah ketika satu objek "adalah-a" dari objek lain, kita membuat Usermodel yang terdiri dari UserServicedan LoggingService.
Semua logika untuk operasi basis data atau jaringan dapat disimpan terpisah dari Usermodel dengan meletakkannya di UserServiceobjek dan menyimpan semua logika untuk masuk LoggingService.
Saya melihat beberapa masalah dengan pendekatan ini adalah:
- Apakah ini menciptakan objek Tuhan? Karena
Usermewarisi dari, atau terdiri dari,UserServicedanLoggingServiceapakah itu benar-benar mengikuti prinsip tanggung jawab tunggal? - Untuk mengakses metode pada objek induk / objek berikutnya (misalnya,
UserService.validate_credentialskita harus menggunakansuper. Ini membuatnya sedikit lebih sulit untuk melihat objek mana yang akan menangani metode ini dan tidak sejelas, katakanlah , InstantiatingUserServicedan melakukan sesuatu sepertiself.user_service.validate_credentials
Apa yang akan menjadi cara Pythonic untuk mengimplementasikan kode di atas?