Найти - Пользователи
Полная версия: Атрибут класса того же типа, что и класс
Начало » Python для экспертов » Атрибут класса того же типа, что и класс
1 2
Bangura
Есть необходимость объявить внутри класса атрибут, класс которого соответствует классу, в котором он объявлен. Во как закрутил :) Например
class superClass:
someVar = superClass()
...
Возможно ли такое без геморроя?
j2a
Используй перегрузку __getattr__
Striver
Можно уже после объявления класса сделать присвоение


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

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


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

У меня аналог указанного класса используется для подмены объектов.
bialix
j2a
Поясни. Я не улавливаю, причем тут списки.

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

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

Если я опять не понял – пожалуйста покажи небольшой пример.
j2a
Угу, в моем случае – monkey patching. А вот зачем это нужно топикстартеру – не понятно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB