Я хотел бы изменить базовый класс класса во время выполнения с помощью __new__. Я выглядел так сильно, как только мог, но я не мог понять.Изменение базового класса класса с помощью __new__
class A(object): pass
class B(object): pass
class C(B):
some_attribute_in_c='hello'
def __new__(cls):
cls.__bases=(A,) #some code here to change the base class
return super(C,cls).__new__(A)
x=C()
x.some_attribute_in_C#return Error: x has no attribute 'some_attribute_in_c'
Что такое правильный код, чтобы положить в __new __(), так что последняя строка возврат «привет» и х является экземпляром C с базовым классом А.
ДОБАВЛЕНО
Моего использования дело в следующем.
class Pet(object):
some_attribute_in_pet='I\'m a pet.'
class Dog(Pet):
some_attribute_in_species='My species is dog.'
class Cat(Pet):
some_attribute_in_species='My species is cat.'
class PetBuyer(Pet):
def __new__(cls,desired_animal):
animal_bought=globals[desired_animal]
cls.__bases=(animal_bought,) #some code here to change the base class
return super(PetBuyer,cls).__new__(animal_bought)
def __init__(self,desired_animal):
print self.some_attribute_in_pet
print self.some_attribute_in_species
x = PetBuyer('Dog')
Мне нужна последняя строка для печати.
Я домашнее животное.
Мои виды - собака.
Моя цель - использовать __new __() в PetBuyer как завод для класса животных. Моя причина для этого заключается в том, что синтаксис PetBuyer («Собака») удобен в моей программе.
ADDED2
Моя причина для этого заключается в следующем. То, что я должен кодировать, является сложным для меня в том смысле, что, видите ли, я не могу вывести правильный дизайн класса. Поэтому я прибегаю к коду моей проблемы в любом случае, я могу рефакторировать, поскольку я лучше понимаю это. Однако с ситуацией, которая возникает выше, мне будет слишком рано рефакторировать. Мне еще предстоит понять взаимодействие между некоторыми компонентами моей проблемы, и изменение базового класса во время выполнения поможет мне это сделать. После этого я буду более удобен для рефакторинга.
У вас нет. Вы указываете правильные основания на момент создания класса. – delnan
'PetBuyer' почти наверняка не является своего рода« любимым », вы обычно составляете два типа, добавляя экземпляры' Pet' в качестве атрибутов в 'PetBuyer'. «Бабушка * имеет * собаку», а не «Бабушка * - это особый вид собаки» – SingleNegationElimination
@TokenMacGuy Пожалуйста, см. ADDED2 для моей мотивации для этого. –