Python: класс который родит не свое дитя
>>> 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
Питоновские объекты слабосвязанные.
Поэтому:
become(a,b):
a.__dict__ = b.__dict__
a.__class__ = b.__class__
Работает для случаев когда внутри класса лежит дикт, а не предустановленный список полей.
По факту это реально изврат и скорее всего задача решается не так, ну, это ты, вроде, и сам понимаешь.
можно ли сделать в питоне класс, который при инициализации с некоторым аргументом даст экземпляр не себя самого, а другого типа, например bool?http://docs.python.org/reference/datamodel.html#object.__new...
похоже что со встроенными типами так нельзя (bool, str,...). Только с тем что объявлено словом class. __new__ тут тоже не поможет похоже...
bool, кажется, нельзяЯ умею:
def A(x):
return bool(x)
Речь шла об инициализации.
Алсо, правильно это всё же делать через __new__: http://ideone.com/p3T8P
можно ли сделать в питоне класс, который при инициализации с некоторым аргументомНо через __new__ логичнее, согласен.
Ну блин очевидно же что чувак не знает о существовании тонких различий между созданием и инициализацией объекта. Которые настолько тонкие, что и я, пожалуй, не представлю себе ситуации где они важны.
Оставить комментарий
gsharov
можно ли сделать в питоне класс, который при инициализации с некоторым аргументом даст экземпляр не себя самого, а другого типа, например bool?понятно, что это изврат и в простейшем случае можно просто определить __nonzero__, но это не то. Тип экземпляра может заранее быть и неизвестен (а скажем задается другим аргументом). На самом деле мне это не особо нужно, просто пытаюсь понять возможно ли такое вообще