Этот вопрос очень похож на this, но у моего производного класса есть дополнительные члены данных. Рассмотрим два класса ниже. Мне нужно преобразовать экземпляры объектов Circle
в экземпляры ColoredCircle
. В моем реальном, менее упрощенном приложении я бы предпочел избежать повторной инициализации тысяч этих объектов, убедившись, что я правильно вызываю конструктор производного класса с базовыми членами экземпляра и еще что-то.Выполнение экземпляра производному классу с дополнительными элементами данных
class Circle(object):
def __init__(self, radius):
self.radius = radius
def area(self):
return pi * self.radius**2
def __str__(self):
return 'Circle: %f' % self.radius
class ColoredCircle(Circle):
def __init__(self, radius, color):
super(ColoredCircle, self).__init__(radius)
self.color = color
def __str__(self):
return 'ColoredCircle: %f %s' % (self.radius, self.color)
def getColor(self):
return self.color
кажется, что если у меня есть Circle
экземпляр c
, я могу изменить его __class__
к ColoredCircle
, и однажды я также установил c.color
, то кажется, что все работает, как если бы я инстанс его с ColoredCircle
, чтобы начать с.
Вопросы:
- Существуют ли какие-либо крупные подводные камни или другие причины, было бы неплохо, чтобы сделать что-то вроде следующего, чтобы привести экземпляр базового класса в экземпляр производного класса?
- Есть ли лучший способ сделать это?
c = Circle(3)
print c # Circle: 3.000000
print c.area() # 28.274333882308138
c.__class__ = ColoredCircle
print c.area() # still works
print c.getColor() # AttributeError: 'ColoredCircle' object has no attribute 'color'
c.color = 'blue'
print c # ColoredCircle: 3.000000 blue
Вопрос 0 должен быть: зачем вы хотите это сделать? Если вы не можете объяснить причину, я закрываю этот вопрос как гипотетический. –
@ 200_success Это определенно не гипотетично, поскольку это то, с чем я столкнулся на работе. У меня есть функция, которая дает мне набор экземпляров базового типа, а позже мне нужно передать производный тип, чтобы я мог использовать функциональные возможности этого типа. –
Не могли бы вы объяснить, почему вы создаете неправильный круг? –