Есть ли правильный способ реализовать подкласс с сигнатурой метода, отличной от его суперкласса в Python? - PullRequest
1 голос
/ 07 февраля 2020

Я определил суперкласс как формальный интерфейс, который другие разработчики будут писать для реализации подклассов, однако аргументы метода будут различаться в зависимости от реализации:

class FormalInterface:
  """ Subclasses will have varying arguments for formal_method """
  def formal_method(*args, required_arg=0):
    raise NotImplemented('Implement me')

  def get_arguments():
    """ Tells the user what arguments need to be passed """
    raise NotImplemented('Implement me')


class MyImplementationOf(FormalInterface):
  def formal_method(concrete_arg1, conrete_arg2, required_arg=0)
    # impelementation...

  def get_arguments():
    return 'concreate_arg1', 'concrete_arg2', 'requried_arg'

Это допустимый код python Однако предостерегает от необходимости повторного определения сигнатуры функции.

Прав ли я просто игнорировать предупреждения в этом случае? Или есть ли еще Pythoni c подход , о котором я должен подумать?

1 Ответ

1 голос
/ 07 февраля 2020

Советы о том, как справиться с этой ситуацией, содержатся в супер-рассмотренном-супер-сообщении в блоге .

Один из способов - использовать только аргументы с ключевыми словами, отбрасывая их. вам нужно использовать **kwargs, чтобы делегировать оставшиеся аргументы другим методам:

class A:
    def m(self, *, x, y):
        print(f'{type(self)=}   {x=}   {y=}')

class B(A):
    def m(self, *, z, **kwargs):
        super().m(**kwargs)
        print(f'{type(self)=}   {z=}')

Вызвать методы следующим образом:

>>> A().m(x=10, y=20)
type(self)=<class '__main__.A'>   x=10   y=20
>>> B().m(x=10, y=20, z=30)
type(self)=<class '__main__.B'>   x=10   y=20
type(self)=<class '__main__.B'>   z=30
...