Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 13, 2007 03:35:03

Bangura
От:
Зарегистрирован: 2007-07-17
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Есть необходимость объявить внутри класса атрибут, класс которого соответствует классу, в котором он объявлен. Во как закрутил :) Например

class superClass:
someVar = superClass()
...
Возможно ли такое без геморроя?



Офлайн

#2 Сен. 13, 2007 05:46:01

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Используй перегрузку __getattr__



Офлайн

#3 Сен. 13, 2007 07:09:26

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Можно уже после объявления класса сделать присвоение


>>> class A(object):
… var1=None

>>> A.var1=A()
>>> A
<class ‘__main__.A’>
>>> A.var1
<__main__.A object at 0x009E1E10>


А если бы можно было сразу в объявлении класса это делать, мне кажется, тогда случилась бы бесконечная рекурсия создания объектов.



Офлайн

#4 Сен. 13, 2007 07:41:51

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Striver
А если бы можно было сразу в объявлении класса это делать, мне кажется, тогда случилась бы бесконечная рекурсия создания объектов.
class Fake(object):
def __getattr__(self, name):
if not name.startswith('__'):
return Fake()
return self.__dict__.get(name)



Офлайн

#5 Сен. 13, 2007 11:18:58

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

вопрос как всегда один: нафига такие извраты? Это вам не Си. Тут готовые списки есть.



Офлайн

#6 Сен. 13, 2007 19:00:53

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Поясни. Я не улавливаю, причем тут списки.

У меня аналог указанного класса используется для подмены объектов.



Офлайн

#7 Сен. 13, 2007 22:40:06

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

j2a
Поясни. Я не улавливаю, причем тут списки.

У меня аналог указанного класса используется для подмены объектов.
В сях для организации связного списка обычно необходимо в объявлении структуры использовать указатель на эту же структуру. Тот кто писал или видел такие вещи помнит этот трюк Мюнхгаузена.

А вот я не улавливаю, что значит подмена объектов и зачем укладывать объект-экземпляр класса внутрь экземпляра класса. Матрешка получается. Может это такая военная хитрость? Честно не могу придумать для чего это. Хоть намекните в каких задачах это используется.



Отредактировано (Сен. 13, 2007 22:41:00)

Офлайн

#8 Сен. 14, 2007 03:55:02

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

bialix
А вот я не улавливаю, что значит подмена объектов и зачем укладывать объект-экземпляр класса внутрь экземпляра класса. Матрешка получается. Может это такая военная хитрость? Честно не могу придумать для чего это. Хоть намекните в каких задачах это используется.
Есть deprecated-класс. Его изменять нельзя (он вне нашего контроля). Чтобы была гарантия, что этот класс больше нигде не используется, вместо него ставится вот такая заглушка, которая при любом обращении к ней “ругается” (warnings.warn).



Офлайн

#9 Сен. 14, 2007 07:26:07

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

j2a
bialix
А вот я не улавливаю, что значит подмена объектов и зачем укладывать объект-экземпляр класса внутрь экземпляра класса. Матрешка получается. Может это такая военная хитрость? Честно не могу придумать для чего это. Хоть намекните в каких задачах это используется.
Есть deprecated-класс. Его изменять нельзя (он вне нашего контроля). Чтобы была гарантия, что этот класс больше нигде не используется, вместо него ставится вот такая заглушка, которая при любом обращении к ней “ругается” (warnings.warn).
Вот это уже ближе к теме, но это не одно и тоже, что в исходном посте.
Тебе по сути нужна обвертка. И такая обвертка – это по сути другой класс. А не засунуть внутрь одного и того же класса объект того же класса. Monkeypatching рулит?

Если я опять не понял – пожалуйста покажи небольшой пример.



Офлайн

#10 Сен. 14, 2007 14:03:47

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Атрибут класса того же типа, что и класс

Угу, в моем случае – monkey patching. А вот зачем это нужно топикстартеру – не понятно.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version