«Невозможно создать экземпляр абстрактного класса… с абстрактными методами» для класса, который не должен иметь никаких абстрактных методов

Возьмите следующий минимальный пример:

import abc

class FooClass(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def FooMethod(self):
    raise NotImplementedError()


def main():
  derived_type = type('Derived', (FooClass,), {})

  def BarOverride(self):
    print 'Hello, world!'
  derived_type.FooMethod = BarOverride

  instance = derived_type()

Выполнение main () дает вам:

TypeError: Can't instantiate abstract class Derived with abstract methods FooMethod

(Исключение встречается в строке instance = производный_тип () .)

Но FooMethod не должен быть абстрактным: я переопределил его с помощью BarOverride . Итак, почему это вызывает исключения?

Отказ от ответственности: Да, я мог бы использовать явный синтаксис class и сделать то же самое. (И даже лучше, я могу заставить его работать!) Но это минимальный тестовый пример, и более крупный пример - это динамическое создание классов. :-) И мне любопытно, почему это не работает.

Изменить: И для предотвращения другого очевидного отсутствия ответа: я не хочу передавать BarOverride в третьем аргументе типу : В реальном примере, BarOverride должен иметь привязанный к нему производный_тип . Это будет легче сделать, если я смогу определить BarOverride после создания производного_типа . (Если я не могу этого сделать, то почему?)

8
задан Zectbumo 17 August 2017 в 06:19
поделиться