Replies: 2 comments 6 replies
-
저는 믹스인의 불확실한 참조로 발생하는 여러 문제를 방지하기 위해 상속을 통한 힌트를 주는방식에 동의하지 않습니다. 제가 보는 파이썬 믹스인은 '어떤 클래스에 추가적인 기능을 제공하기 위한 기능을 담고있는 클래스' 입니다. 위의 예시 코드에서는 믹스인을 사용하는 클래스들이 하나의 부모로부터 파생된 클래스들에 믹스인이 붙는것으로 보이는데요. 서로 다른 두 클래스가 동일한 동작을 원하는 경우, 믹스인에 정의된 함수 규칙에 따라 클래스들을 구현하게 되면 원하는 기능을 다형적으로 동작하게 할 수 있을듯합니다. 예를들면 다음과 같습니다. class ParentA:
def do_a(self):
pass
class ParentB:
def do_b(self):
pass
class LogMixin:
def log(self):
logger = self.get_logger()
logger.info('로깅')
class A(LogMixin, ParentA):
def get_logger(self):
return logger_from_A
class B(LogMixin, parentB):
def get_logger(self):
return logger_from_B 또한 특별히 믹스인에서 발생하는 경고와, 런타임 에러로 인해 중요한 문제가 발생한 경험이 없었습니다. 저희가 사용중인 몇몇 오픈소스 레퍼런스를 찾아보았는데요. Django, DRF, Werkzeug 등의 믹스인에서도 불확실한 참조가 그대로 사용되는것 같습니다. |
Beta Was this translation helpful? Give feedback.
-
재영님 말씀을 듣고 생각해보니, 다음과 같은 경우에는 적용이 어려울 것 같습니다.
그래서 아예 불확실한 참조를 금지할 수는 없을 것 같고, 타입 힌트처럼
|
Beta Was this translation helpful? Give feedback.
-
저희 코드에는 다양한 Mixin이 쓰이고 있는데, 그 중에는 다음과 같은 불확실한 참조를 포함하는 경우가 있습니다.
위 예시 코드는 이 두 가지 문제를 모두 담고 있습니다.
런타임에는 잘 동작하지만, IDE는 이에 대해 경고를 표시합니다.
왜냐하면,
Mixin
입장에서는,Parent
클래스도 상속해주길 믿고 기대할 수 밖에 없고,만약 자식 클래스가 잘못된 상속 관계를 가지더라도 정적으로 이를 판단할 수 없어 런타임 에러의 발생을 막을 수 없기 때문입니다.
또한
Mixin
클래스의 자체 인스턴스화도 막을 수 없습니다.이는 다음과 같이 깔끔하게 해결할 수 있습니다.
abc.abstractmethod
로 선언이제 경고가 Mixin 클래스가 아니라, 실제로 잘못을 한 Child2 클래스에서 발생합니다.
그리고 Child2가 생성되는 시점에서 에러가 발생합니다. 기존에는 생성은 잘 되고, 메서드 호출에서 에러가 발생했습니다.
보다 이른 시점에 에러가 발생하기 때문에 더 낫습니다.
두 번째 super에 대한 부분에서는, Mixin이 부르는 super의 대상이 그 때 그때 달라져야할 때 문제가 될 수 있습니다. 그럴 때에는, 동작을 가지지 않는, 최상위 베이스 클래스를 상속하면 됩니다(없으면 만들어야 합니다).
올바른 상속 관계를 가지지 않는
Child3
에서도 경고가 나타남을 볼 수 있습니다.역시 이를 무시하고 생성하면 생성 시점에 에러가 발생합니다.
위 방법들을 활용해서, Mixin 클래스에서 불확실한 참조를 하지 않도록 할 수 있으므로,
Mixin 클래스에서 불확실한 참조를 금지하는 정책을 제안합니다.
혹시 위 경우 외에, 어쩔 수 없이 불확실한 참조가 필요한 경우가 있거나,
더 좋은 방법이 있다면 의견 부탁드립니다.
Beta Was this translation helpful? Give feedback.
All reactions