Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 09 Февраль, 2012, 07:47:50

Страниц: [1]
Печать
Автор Тема: setattr  (Прочитано 558 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vasa_c    ↓ 
24 Июль, 2010, 03:21:47
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Некоторое продолжение темы про пустой объект.
 
Хочу сделать объект-набор переменных, с доступом, и как к словарю и как к объекту со свойствами.
 
Python

#!/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__ срабатывает уже в конструкторе на
Python
self.attrs = attrs
И получается легендарная бесконечная рекурсия.
 
Как setattr правильно использовать?
« Последнее редактирование: 24 Июль, 2010, 03:21:47 от vasa_c » Записан

vasa_c    ↓ 
24 Июль, 2010, 03:22:27 , спустя 40 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Извратился:
 
Python

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 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: 19712
Сила слова: 1.72

vasa_c, в питоне это типа "евента", а не просто метод который вызывается при отсутствии свойства?
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
vasa_c    ↓ 
24 Июль, 2010, 06:58:52 , спустя 6 минут 49 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Просто "магический" метод.
Только в питоне нельзя описать свойства объекта, как в том же PHP - с public, private...
Поэтому объявлять свойства приходится в конструкторе, а там уже __setattr__ срабатывает.
Записан

phpdude    ↓ 
24 Июль, 2010, 07:03:41 , спустя 4 минуты 49 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

vasa_c, интересный подход, а чо, все методы везде доступны?
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
vasa_c    ↓ 
24 Июль, 2010, 07:05:06 , спустя 1 минуту 25 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

да, там нет скрытых.
Записан

phpdude    ↓ 
24 Июль, 2010, 07:07:41 , спустя 2 минуты 35 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

vasa_c, хуево, а как коммерческие либы реализуют? оО там есть рефлексия какая нить? чтобы поглядеть страктуру? или там и так можно распеатать объект, аляпринт_р, помоему можно было
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
vasa_c    ↓ 
24 Июль, 2010, 07:10:51 , спустя 3 минуты 10 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

хуево, а как коммерческие либы реализуют?
А чем это мешает?
 
там есть рефлексия какая нить? чтобы поглядеть страктуру?
Что есть структура? Просто набор свойств?
print(dir(object))
Записан

phpdude    ↓ 
24 Июль, 2010, 07:15:02 , спустя 4 минуты 11 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

Что есть структура? Просто набор свойств?
ну да
 
А чем это мешает?
это не мешает ничем, просто я вот люблю все скрывать например. вот ты человек, тебя же можно попросить "покажи член" (getChlen()) которая возвращает член return #this->chlen, и это какбы правильно. а прикинь идешь по улице и без этого гетера у тебя кто-то член достает ))))))))))))))))))))))) поэтому люблю скрывать, в питоне нельзя скрыть получается свойства объекта? или я тебя неправильно понял?
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
vasa_c    ↓ 
24 Июль, 2010, 07:49:42 , спустя 34 минуты 40 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Нельзя. В Питоне объекты не стеснительные, а если кому-то вздумается копаться в их грязном белье - это уже его проблемы )
Записан

phpdude    ↓ 
24 Июль, 2010, 07:56:13 , спустя 6 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

vasa_c, хревоно))) возможно они поступились с этой возможностью ради скорости, возможно ради удобства синтаксиса лдано опухуй тогда :)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
vasa_c    ↓ 
24 Июль, 2010, 09:13:27 , спустя 1 час 17 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Как в JS сделать private и т.п, когда функции к объектам не привязаны?
Так и в Питоне немного похожая модель.
Записан

phpdude    ↓ 
24 Июль, 2010, 09:21:05 , спустя 7 минут 38 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

Как в JS сделать private и т.п, когда функции к объектам не привязаны?
если я правильно понял вопрос
 
Javascript
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 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 78
Сообщений: 2337
Сила слова: 3.34

Ну, это не приватная функция, это замыкание, которое отдалённо может быть на неё похожа.
И я такое обычно не люблю,
во-первых создаётся на каждый объект по замыканию,
во-вторых, все методы, которые будут её использовать нужно писать внутри конструктора, а это опять-таки на каждый объект по экземпляру.
 
Впрочем, в Питоне тоже замыкания есть и там такое же можно сделать.
Записан

Страниц: [1]
Печать
 

Перейти в: