|
vasa_c ↓
|
 |
|
24 Июль, 2010, 03:21:47
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Некоторое продолжение темы про пустой объект.
Хочу сделать объект-набор переменных, с доступом, и как к словарю и как к объекту со свойствами.
#!/usr/bin/python3
class Conf:
def __init__(self, attrs = None):
if attrs is not None:
self.attrs = attrs
else:
self.attrs = {}
def __setitem__(self, name, value):
self.attrs[name] = value
def __getitem__(self, name):
return self.attrs[name]
def __setattr__(self, name, value):
self.attrs[name] = value
def __getattr__(self, name):
if name not in self.attrs:
return None
return self.attrs[name]
def __delattr__(self, name):
# ...
init = {'a': 1, 'b': 2}
c = Conf(init)
Однако __setattr__ срабатывает уже в конструкторе на
self.attrs = attrs
И получается легендарная бесконечная рекурсия.
Как setattr правильно использовать?
|
|
|
|
« Последнее редактирование: 24 Июль, 2010, 03:21:47 от vasa_c »
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 03:22:27 , спустя 40 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Извратился:
class Conf:
def __init__(self, attrs = None):
if attrs is not None:
self.attrs = attrs
else:
self.attrs = {}
self.__setattr__ = self.tmp__setattr__
def tmp__setattr__(self, name, value):
self.attrs[name] = value
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 06:52:03 , спустя 3 часа 29 минут 36 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: 20793 Сила слова: 1.66
|
vasa_c, в питоне это типа "евента", а не просто метод который вызывается при отсутствии свойства?
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 06:58:52 , спустя 6 минут 49 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Просто "магический" метод.
Только в питоне нельзя описать свойства объекта, как в том же PHP - с public, private...
Поэтому объявлять свойства приходится в конструкторе, а там уже __setattr__ срабатывает.
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 07:03:41 , спустя 4 минуты 49 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: д-о-х-у-я! Сила слова: 1.66
|
vasa_c, интересный подход, а чо, все методы везде доступны?
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 07:05:06 , спустя 1 минуту 25 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
да, там нет скрытых.
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 07:07:41 , спустя 2 минуты 35 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: д-о-х-у-я! Сила слова: 1.66
|
vasa_c, хуево, а как коммерческие либы реализуют? оО там есть рефлексия какая нить? чтобы поглядеть страктуру? или там и так можно распеатать объект, аляпринт_р, помоему можно было
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 07:10:51 , спустя 3 минуты 10 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
хуево, а как коммерческие либы реализуют?
А чем это мешает?
там есть рефлексия какая нить? чтобы поглядеть страктуру?
Что есть структура? Просто набор свойств?
print(dir(object))
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 07:15:02 , спустя 4 минуты 11 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: д-о-х-у-я! Сила слова: 1.66
|
Что есть структура? Просто набор свойств?
ну да
А чем это мешает?
это не мешает ничем, просто я вот люблю все скрывать например. вот ты человек, тебя же можно попросить "покажи член" (getChlen()) которая возвращает член return #this->chlen, и это какбы правильно. а прикинь идешь по улице и без этого гетера у тебя кто-то член достает ))))))))))))))))))))))) поэтому люблю скрывать, в питоне нельзя скрыть получается свойства объекта? или я тебя неправильно понял?
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 07:49:42 , спустя 34 минуты 40 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Нельзя. В Питоне объекты не стеснительные, а если кому-то вздумается копаться в их грязном белье - это уже его проблемы )
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 07:56:13 , спустя 6 минут 31 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: 20793 Сила слова: 1.66
|
vasa_c, хревоно))) возможно они поступились с этой возможностью ради скорости, возможно ради удобства синтаксиса лдано опухуй тогда :)
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 09:13:27 , спустя 1 час 17 минут 14 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Как в JS сделать private и т.п, когда функции к объектам не привязаны?
Так и в Питоне немного похожая модель.
|
|
|
|
|
Записан
|
|
|
|
|
phpdude ↓
|
 |
|
24 Июль, 2010, 09:21:05 , спустя 7 минут 38 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 345
Сообщений: 20793 Сила слова: 1.66
|
Как в JS сделать private и т.п, когда функции к объектам не привязаны?
если я правильно понял вопрос
function MyClass() {
var private_func = function () { ... };
private_func(param, param2);
} а если неправильно, то объясни что ты имел ввиду более подробно)
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
24 Июль, 2010, 10:18:12 , спустя 57 минут 7 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Ну, это не приватная функция, это замыкание, которое отдалённо может быть на неё похожа.
И я такое обычно не люблю,
во-первых создаётся на каждый объект по замыканию,
во-вторых, все методы, которые будут её использовать нужно писать внутри конструктора, а это опять-таки на каждый объект по экземпляру.
Впрочем, в Питоне тоже замыкания есть и там такое же можно сделать.
|
|
|
|
|
Записан
|
|
|
|
|