Python: класс который родит не свое дитя

gsharov

можно ли сделать в питоне класс, который при инициализации с некоторым аргументом даст экземпляр не себя самого, а другого типа, например bool?
понятно, что это изврат и в простейшем случае можно просто определить __nonzero__, но это не то. Тип экземпляра может заранее быть и неизвестен (а скажем задается другим аргументом). На самом деле мне это не особо нужно, просто пытаюсь понять возможно ли такое вообще :)

doublemother

bool, кажется, нельзя, а вот с другим классом можно сделать вот так:
>>> class A(object):
... def echo(self):
... print "A"
...
>>> class B(object):
... def __init__(self):
... self.__class__ = A.__class__
...
>>> a = B
>>> a
<__main__.A object at 0x7ff452b301d0>
>>> a.echo
A

yroslavasako

можно. Даже метакласс писать не обязательно.
Питоновские объекты слабосвязанные.
Поэтому:

become(a,b):
a.__dict__ = b.__dict__
a.__class__ = b.__class__

Работает для случаев когда внутри класса лежит дикт, а не предустановленный список полей.

tipnote

Можно. Используй метаклассы и/или модуль inspect, setattr и т.д. Использование __dict__ и __class__ не рекомендую.
По факту это реально изврат и скорее всего задача решается не так, ну, это ты, вроде, и сам понимаешь.

pilot

можно ли сделать в питоне класс, который при инициализации с некоторым аргументом даст экземпляр не себя самого, а другого типа, например bool?
http://docs.python.org/reference/datamodel.html#object.__new...

gsharov

похоже что со встроенными типами так нельзя (bool, str,...). Только с тем что объявлено словом class. __new__ тут тоже не поможет похоже...

pilot

bool, кажется, нельзя
Я умею:
def A(x):
return bool(x)

doublemother

Речь шла об инициализации.

bleyman

Почему ты думаешь что это важно, что должна быть именно инициализация?
Алсо, правильно это всё же делать через __new__: http://ideone.com/p3T8P

doublemother

Потому что в первом посте написано:
можно ли сделать в питоне класс, который при инициализации с некоторым аргументом
Но через __new__ логичнее, согласен.

bleyman

> Потому что в первом посте написано:
Ну блин очевидно же что чувак не знает о существовании тонких различий между созданием и инициализацией объекта. Которые настолько тонкие, что и я, пожалуй, не представлю себе ситуации где они важны.
Оставить комментарий
Имя или ник:
Комментарий: