Возьмите следующий минимальный пример:
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
после создания производного_типа
. (Если я не могу этого сделать, то почему?)