LINUX.ORG.RU

Динамическое наследование [python]

 


0

0

Подскажите, как можно (красиво) из экземпляра класса в python
унаследовать другой экземпляр класса (если такое вообще возможно)?

Например:
class A:
    a=0
    b=0

class B(A):
    a=1
    c=0

a=A()
a.b=1
print a.__class__
#должно получиться __main__.A
#тут что-то делаем, вопрос - что именно.
######
print a.__class__
#получается __main__.B
print a.a, a.b, a.b
#должно получиться a.a=1 (перегрузилось из B),
#a.b=1 (из исходного экземпляра), a.c=0 (просто из B)
★★★★

Да так прямо и делается: a.__class__ = B. Только для этого надо
использовать «новые» классы.

class A(object):
    a = 0
    b = 0

class B(A):
    a = 1
    c = 0

a = A()
a.b = 1
print a.a # 0
print a.b # 1

a.__class__ = B
print a.a # 1
print a.b # 1
print a.c # 0

PS А зачем такое?

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

Спасибо, как всегда в питоне интересное решение.

Просто хотелось добавить к уже готовому объекту некоторое свойство (типа "тебя мы уже посчитали"). Но поскольку класс чужой, страшно работать с его атрибутами напрямую (вдруг, в новой версии появится атрибут с таким же именем).

Решение - обёртка.

P.S. А конструктор у B при этом не вызывается? Где почитать по-подробнее?

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

> cтрашно работать с его атрибутами напрямую (вдруг, в новой версии появится атрибут с таким же именем).

> Решение - обёртка.

Хм, а оно спасает в случае появления нового атрибута с тем же именем?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Если нам этот атрибут не нужен, то спасёт.

Ведь у нас будет перегруженная версия (скажем B.a), а сам экземпляр базового класса будет работать со своим внутренним A.a.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

>А о чём, собственно, речь?

Вопрос показался несколько смешным. Вероятно, из-за того, что автор мало знаком со змием (я его вообще не знаю, сужу по плюсам). Вообщем, не важно. )

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.