Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2009 19:21:47

qwer
От:
Зарегистрирован: 2009-03-30
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

замена self другим объектом

может ли объект в своем методе заменить свой self другим объектом (например создать новый объект-потомок своего класса, скопировать свое содержимое с некоторыми изменениями) ?



Офлайн

#2 Ноя. 22, 2009 19:33:35

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

замена self другим объектом

Родить наследника можно.

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()



Офлайн

#3 Ноя. 22, 2009 19:44:14

Slava
От:
Зарегистрирован: 2009-11-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

замена self другим объектом

Можно, только изврат это какой-то.

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__



Офлайн

#4 Ноя. 22, 2009 23:51:57

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

замена self другим объектом

Slava
Вы __slots__ забыли обработать правильно. А еще есть weakref list и много всего интересного. Т.е. в общем виде - не работатет.
qwer
Оно не нужно (и не только в случае именно этого языка программирования). В отличие, скажем, от С++ Питон работает только со ссылками и не имеет аналога “автоматической переменной на стеке”. Поэтому не требуется конструктор копирования и оператор присваивания.
И не зачем их пытаться изобрести. Уверен, при более внимательном рассмотрении вопроса обязательно найдется лучшая альтернатива.



Офлайн

#5 Ноя. 23, 2009 15:32:05

Slava
От:
Зарегистрирован: 2009-11-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

замена self другим объектом

Про __slots__ не забывал, только если все учитывать (__metaclass__, __mro__ и т.д.) слишком большой код получится. Да и заменять так объект, не лучшее решение, только так для головоломки, не для рабочих проектов.



Офлайн

#6 Ноя. 23, 2009 20:23:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

замена self другим объектом

Угу



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version