파이썬이 다중 상속을 허용한다는 것을 감안할 때 파이썬의 관용 상속은 어떻게 생겼습니까?
Java와 같은 단일 상속을 가진 언어에서 상속은 하나의 객체가 다른 객체의 "is-a"라고 말하고 객체간에 코드를 공유하려고 할 때 사용됩니다 (부모 객체에서 자식 객체로). 예를 들어, 당신은 말할 수 Dog
A는 Animal
:
public class Animal {...}
public class Dog extends Animal {...}
그러나 파이썬은 다중 상속을 지원하므로 다른 많은 객체를 함께 구성하여 객체를 만들 수 있습니다. 아래 예를 고려하십시오.
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
파이썬에서 다중 상속을 허용하거나 잘 사용합니까? 상속은 하나의 객체가 다른 객체의 "is-a"일 때 대신에 와 User
로 구성된 모델 을 만듭니다 .UserService
LoggingService
데이터베이스 또는 네트워크 작업에 대한 모든 논리 User
는 UserService
개체 에 넣고 모델에 로그인하기위한 모든 논리를 유지 하여 모델 과 별도로 유지할 수 있습니다 LoggingService
.
이 접근 방식의 일부 문제는 다음과 같습니다.
- 이것이 신의 대상을 창조 하는가? 이후
User
의 상속 또는 구성되어,UserService
그리고LoggingService
정말 단일 책임의 원칙을 따르고있다? - 부모 / 다음 인라인 객체의 메소드에 액세스하려면 (예 :
UserService.validate_credentials
을 사용해야super
합니다.)이 메소드를 처리 할 객체를 확인하기가 조금 더 어렵고 명확하지 않습니다. , 인스턴스화UserService
및 같은 일을self.user_service.validate_credentials
위의 코드를 구현하는 Pythonic 방법은 무엇입니까?