qwer
Ноя. 22, 2009 19:21:47
может ли объект в своем методе заменить свой self другим объектом (например создать новый объект-потомок своего класса, скопировать свое содержимое с некоторыми изменениями) ?
pasaranax
Ноя. 22, 2009 19:33:35
Родить наследника можно.
class Cl(object):
def m(self):
print "Cl's method"
def birth(self):
class Heier(type(self)): pass
return Heier
c = Cl()
c.m()
subC = c.birth()()
subC.m()
Slava
Ноя. 22, 2009 19:44:14
Можно, только изврат это какой-то.
class B(object):
def __init__(self, a):
self.c = a;
def f2(self):
return self.c
class A(object):
def __init__(self, a):
self.a = 34
def strange_func(self, c):
self.__class__ = B
self.__dict__.clear()
obj = B(c)
self.__dict__.update(obj.__dict__)
def f1(self):
return self.a
j = A(122)
print j.a
j.strange_func(33)
print j.f2()
print j.__class__
Андрей Светлов
Ноя. 22, 2009 23:51:57
Slava
Вы __slots__ забыли обработать правильно. А еще есть weakref list и много всего интересного. Т.е. в общем виде - не работатет.
qwer
Оно не нужно (и не только в случае именно этого языка программирования). В отличие, скажем, от С++ Питон работает только со ссылками и не имеет аналога “автоматической переменной на стеке”. Поэтому не требуется конструктор копирования и оператор присваивания.
И не зачем их пытаться изобрести. Уверен, при более внимательном рассмотрении вопроса обязательно найдется лучшая альтернатива.
Slava
Ноя. 23, 2009 15:32:05
Про __slots__ не забывал, только если все учитывать (__metaclass__, __mro__ и т.д.) слишком большой код получится. Да и заменять так объект, не лучшее решение, только так для головоломки, не для рабочих проектов.
Андрей Светлов
Ноя. 23, 2009 20:23:08
Угу