Python'un çoklu kalıtıma izin verdiği göz önüne alındığında, Python'daki deyimsel kalıtım neye benziyor?
Java gibi tek kalıtıma sahip dillerde, bir nesnenin başka bir nesnenin "a-a" olduğunu ve nesneler arasında (üst nesneden alt nesneye) kod paylaşmak istediğinizde kalıtım kullanılır. Örneğin, diyebiliriz Dogbir olduğunu Animal:
public class Animal {...}
public class Dog extends Animal {...}
Ancak Python çoklu kalıtım desteklediğinden, diğer birçok nesneyi bir araya getirerek bir nesne oluşturabiliriz. Aşağıdaki örneği düşünün:
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
Bu, Python'da çoklu kalıtımın kabul edilebilir veya iyi bir kullanımı mı? Kalıtım demek, bir nesnenin başka bir nesnenin "a-" olduğu zaman User, UserServiceve öğelerinden oluşan bir model yaratırız LoggingService.
Veritabanı veya ağ işlemleri için tüm mantık User, UserServicenesneye yerleştirilerek modelden ayrı tutulabilir ve oturum açmak için tüm mantık saklanabilir LoggingService.
Bu yaklaşımla ilgili bazı sorunlar görüyorum:
- Bu bir Tanrı nesnesi yaratıyor mu? Beri
Usermiras kaldığı veya onlardan oluştuğuUserServiceveLoggingServicegerçekten tek sorumluluk ilkesini takip ettiğinden mi? - Bir üst / sonraki satır içi nesnede yöntemlere erişmek için (örneğin,
UserService.validate_credentialskullanmamız gerekirsuper. , örneklemeUserServiceve benzeri bir şey yapmaself.user_service.validate_credentials
Yukarıdaki kodu uygulamanın Pythonic yolu ne olurdu?