Примечание: Я исправил написание Original
в этом ответе
Представляется, что проблема заключается в том, что, когда ваш Modified
объект быть экземпляр и super
называется, его называют, как: super(Original, self)
, поскольку это аргументы по умолчанию для super
. Поскольку Original
не является суперклассом Modified
(отметьте isinstance(m, Original)
), питон не позволяет вам звонить super
таким образом.
Следующий код делает что-то похожее на ваше, но лучше иллюстрирует проблему.
class Base():
def __init__(self):
print("Base init")
class Original(Base):
def __init__(self):
super().__init__()
print("Orginal init")
class Modified(Base):
def __init__(self):
super(Original, self).__init__() # illegal
Modified.__name__ == Original.__name__
m = Modified() # raises same Exception that your your code does
Добавление Original
к bases
из Modified
сделают работу:
Modified = type(Original.__name__, (Original,) + Original.__bases__, dict(Original.__dict__))
Редактировать:
За комментариями, указанное предложение может быть упрощена, так как все методы, содержащиеся в пределах Original
, будут включены в Modified
без необходимости проходить dict
в type
вызова:
Modified = type(Original.__name__, (Original,), {})
и собирается один шаг дальше, если вы не хотите Modified
быть подклассом Original
, вы можете просто сделать Modified
копию из Original
и затем добавить те же атрибуты, как вы в вашем примере:
from copy import deepcopy
Modified = deepcopy(Original)
Modified.f = lambda self: print("f")
m = Modified()
L ooking в this answer, кажется, что вы не можете использовать deepcopy
копировать классы, и при условии, что у вас есть, что super()
вызов в методе Original.__init__
, Modified
быть подклассом Original
(если вы также изменить метод __init__
в вашем Modified
классе после того, как это было " скопировано ").
Я думаю, что ваш класс должен называться «Оригинал». – CodenameLambda