ФорумПрограммированиеPython → setattr

setattr

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 15:21

    Некоторое продолжение темы про пустой объект.

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


    #!/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 правильно использовать?
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 15:22, спустя 40 секунд

    Извратился:


    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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 18:52, спустя 3 часа 29 минут 36 секунд

    vasa_c, в питоне это типа "евента", а не просто метод который вызывается при отсутствии свойства?
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 18:58, спустя 6 минут 49 секунд

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:03, спустя 4 минуты 49 секунд

    vasa_c, интересный подход, а чо, все методы везде доступны?
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:05, спустя 1 минуту 25 секунд

    да, там нет скрытых.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:07, спустя 2 минуты 35 секунд

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

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:10, спустя 3 минуты 10 секунд

    хуево, а как коммерческие либы реализуют?

    А чем это мешает?

    там есть рефлексия какая нить? чтобы поглядеть страктуру?

    Что есть структура? Просто набор свойств?
    print(dir(object))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:15, спустя 4 минуты 11 секунд

    Что есть структура? Просто набор свойств?

    ну да

    А чем это мешает?

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

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:49, спустя 34 минуты 40 секунд

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 19:56, спустя 6 минут 31 секунду

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

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 21:13, спустя 1 час 17 минут 14 секунд

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 21:21, спустя 7 минут 38 секунд

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

    если я правильно понял вопрос

    function MyClass() {

    var private_func = function () { … };
    private_func(param, param2);

    }
    а если неправильно, то объясни что ты имел ввиду более подробно)
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 24 июля 2010 г. 22:18, спустя 57 минут 7 секунд

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

    Впрочем, в Питоне тоже замыкания есть и там такое же можно сделать.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!