Python: несколько свойств, один установщик / получатель

Я нашел эту тему полезной и подумал, что добавлю Javascript-решение, которое вы можете вставить в Firebug.

function string_recurse(active, rest) {
    if (rest.length == 0) {
        console.log(active);
    } else {
        string_recurse(active + rest.charAt(0), rest.substring(1, rest.length));
        string_recurse(active, rest.substring(1, rest.length));
    }
}
string_recurse("", "abc");

Выход должен быть следующим:

abc
ab
ac
a
bc
b
c
16
задан Decio Lira 23 January 2010 в 16:18
поделиться

4 ответа

def attrsetter(attr):
  def set_any(self, value):
    setattr(self, attr, value)
  return set_any

a = property(fset=attrsetter('_a'))
b = property(fset=attrsetter('_b'))
c = property(fset=attrsetter('_c'))
20
ответ дан 1 December 2019 в 02:19
поделиться
def attrsetter(attr):
  def set_any(self, value):
    setattr(self, attr, value)
  return set_any

a = property(fset=attrsetter('_a'))
b = property(fset=attrsetter('_b'))
c = property(fset=attrsetter('_c'))
-121--1742835-

Ваш список специально не исключает CocoaPython/PyObjC , который был бы полностью встроен в Mac OS X. Он бы не работал ни на чем другом, хотя

-121--4028801-
class...
 def __setattr__(self, name, value):
  print 'setting', name
  self.__dict__[name] = value

Все.

2
ответ дан 1 December 2019 в 02:19
поделиться

Может быть, вы ищете __ Setattr __ (я, имя, значение)

посмотрите здесь

1
ответ дан 1 December 2019 в 02:19
поделиться

Я вижу, что ваши загадки просто регистрируют сообщение, а затем просто назначают значение - на самом деле, ваш принятый ответ только назначает значение. Вы используете этот шаблон, потому что это принятая практика / обычная мудрость на некотором другом языке, возможно, то имя которого начинается с «J»? Если это так, тогда, пожалуйста, узнайте, что подход Pythonic к этому же дизайну - это гораздо проще:

class Of2010(object):
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

Нет. Нет - ничего не настраивает, без промежуточных функций не требует, чтобы назначить значение. "Что ты говоришь? «Общественное воздействие переменных членов? !!» Ну, Да на самом деле.

Посмотрите на эти классы с точки зрения клиентского кода. Чтобы использовать ваш класс, клиенты создают объект, а затем назначьте свойство «A», используя:

obj = Of2010()
obj.a = 42

. Примечательно, это тот же код для 5-лайнера, который я разместил выше.

Почему J-language поощряет более просторно стиль свойств? Чтобы сохранить интерфейс класса в случае будущих изменений в требованиях. Если в какой-то момент времени некоторое время, какое-то другое значение объекта должно измениться в концерте с любыми изменениями в A, то необходимо внедрить механизм свойств. К сожалению, J-Language подвергает природу механизма доступа к атрибуту к Кодексу клиента, чтобы ввести свойство в какой-то момент в будущем, является задачей навязчивой рефакторизации, которая потребует восстановления всех клиентов, которые используют этот класс и его «атрибут».

В Python такой не тот случай. Доступ к атрибуту «A» объекта определяется во время выполнения в вызывающем абонете. Поскольку прямой доступ и доступ к имуществу как «смотреть» так же, ваш класс Python сохраняет этот интерфейс, даже если фактический механизм отличается. Что имеет значение то, что он идентичен, насколько касается клиентского кода.

Итак, в Java, один вводит эту сложность свойств справа от создания этого класса (и на самом деле, принимающей практикой все классов), о том, что он может стать необходимым день в будущем. С Python можно начать с реализации самой простой вещи, которая может работать, то есть прямой доступ к простым переменным участника, оставляя комплексный подход на время в будущем, что на самом деле требуется дополнительные вещи и значение. С того дня на самом деле не может прийти, это огромный прыжок вперед в получении этой первой рабочей версии вашего кода из двери.

6
ответ дан 1 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: