Как я могу вызвать метод суперкласса с данными из подкласса? - PullRequest
0 голосов
/ 27 февраля 2020

Я анализирую данные из файла XML, и мне нужно преобразовать некоторые из них в целые числа - при установке их в атрибуты класса B. Поскольку у меня есть несколько подклассов, я пытаюсь написать код один раз в суперклассе вместо необходимости писать его в каждом подклассе.

class A:

  def __setattr__(self, name, value):
    if isinstance(__class__.__dict__[name], int):
      self.__dict__[name] = int(value)

class B(A):

  val = int()

  def __init__(self, val):
    self.val = val


b = B("4")
print(type(b.val))

Моя проблема в том, что __class__ и self относятся к суперкласс. Мне нужны те из подклассов. Любые идеи?


Я не уверен, если я очень хорошо объясню свою проблему, поэтому вот код, если мне нужно было сделать это только для одного класса:

class A:
  val = int()

  def __init__(self, val1): #val1 is a string
    self.val = val1

  def __setattr__(self, name, value):
    if isinstance(A.__dict__[name], int):
      self.__dict__[name] = int(value)

b = A("4")
print(type(b.val)) #prints <class 'int'>

1 Ответ

0 голосов
/ 28 февраля 2020

Используйте classmethod для получения производного класса и передачи известного себя в качестве параметра

class A:

  def __setattr__(self, name, value):
    self._setter(self, name, value)

  @classmethod
  def _setter(cls, self, name, value):
      if isinstance(getattr(cls, name), int):
         self.__dict__[name] = int(value)

class B(A):

  val = int()

  def __init__(self, val):
    self.val = val


b = B("4")
print(type(b.val), b.val)

Вместо присвоения переменной и использования ее типа, вы можете просто назначить сам тип в классе , Я поместил все это в диктовку под названием schema, потому что это, кажется, лучше документирует, что происходит со мной.

class A:

  schema = {}

  def __setattr__(self, name, value):
    self._setter(self, name, value)

  @classmethod
  def _setter(cls, self, name, value):
      if name in cls.schema:
          value = cls.schema[name](value)
      self.__dict__[name] = value

class B(A):

  schema = {"val":int}

  def __init__(self, val):
      self.val = val

b = B("4")
print(type(b.val), b.val)
...