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 Dog
bir 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
, UserService
ve öğelerinden oluşan bir model yaratırız LoggingService
.
Veritabanı veya ağ işlemleri için tüm mantık User
, UserService
nesneye 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
User
miras kaldığı veya onlardan oluştuğuUserService
veLoggingService
gerç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_credentials
kullanmamız gerekirsuper
. , örneklemeUserService
ve benzeri bir şey yapmaself.user_service.validate_credentials
Yukarıdaki kodu uygulamanın Pythonic yolu ne olurdu?