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 Dog
ini 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 User
model yang terdiri dari UserService
dan LoggingService
.
Semua logika untuk operasi basis data atau jaringan dapat disimpan terpisah dari User
model dengan meletakkannya di UserService
objek dan menyimpan semua logika untuk masuk LoggingService
.
Saya melihat beberapa masalah dengan pendekatan ini adalah:
- Apakah ini menciptakan objek Tuhan? Karena
User
mewarisi dari, atau terdiri dari,UserService
danLoggingService
apakah itu benar-benar mengikuti prinsip tanggung jawab tunggal? - Untuk mengakses metode pada objek induk / objek berikutnya (misalnya,
UserService.validate_credentials
kita harus menggunakansuper
. Ini membuatnya sedikit lebih sulit untuk melihat objek mana yang akan menangani metode ini dan tidak sejelas, katakanlah , InstantiatingUserService
dan melakukan sesuatu sepertiself.user_service.validate_credentials
Apa yang akan menjadi cara Pythonic untuk mengimplementasikan kode di atas?