В частности, я хочу иметь возможность поддерживать lambda: <some_or_other_setter>
, но я хочу, чтобы код был ясным и лаконичным.Я должен проверить значение, поэтому мне нужен какой-то сеттер.Мне нужно использовать лямбду, потому что мне нужно передавать обратные вызовы событиям Tkinter.Мне также нужно иметь возможность изменять значение атрибута вне привязки.
В моих следующих примерах предположим, что виджет кнопки с именем spam_button
был объявлен глобально.Также предположим, что класс Eggs
будет иметь как минимум 10 атрибутов, к которым необходимо обращаться одинаково (мне нравится согласованность).
Первый возможный способ сделать это - использовать только методы получения и установки:
class Eggs(object):
def __init__(self):
self._spam = ''
self.set_spam('Monster')
print self.get_spam()
spam_button.bind('<Enter>', lambda: self.set_spam('Ouch'))
def set_spam(self, spam):
if len(spam) <= 32:
self._spam = spam
def get_spam(self):
return self._spam
Но если я использую этот метод и у меня много атрибутов, код может оказаться слишком длинным для управления.
Второй способ, которым я мог бы это сделать, - это использовать свойства и использоватьsetter в обратном вызове:
class Eggs(object):
def __init__(self):
self._spam = ''
self.spam = 'Monster'
print self.spam
spam_button.bind('<Enter>', lambda: self.set_spam('Ouch'))
def set_spam(self, spam):
if len(spam) <= 32:
self._spam = spam
def get_spam(self):
return self._spam
spam = property(get_spam, set_spam)
Этот способ немного проще первого при прямом доступе к атрибуту, но несовместим при использовании лямбды.
Третий способ сделать эточтобы создать дополнительный класс с методами get и set:
class Spam(object):
def __init__(self):
self._value = ''
def set(self, value):
if len(spam) <= 32:
self._value = value
def get(self):
return self._value
class Eggs(object):
def __init__(self):
self._spam = ''
self.spam = Spam()
self.spam.set('Monster')
print self.spam.get()
spam_button.bind('<Enter>', lambda: self.spam.set('Ouch'))
Этот метод более организован, чем первый, но мне нужно будет создать класс для каждого типа проверки.
последний способ сделать это - использовать методы вместо свойств (свойства были вторым примером):
class Eggs(object):
def __init__(self):
self._spam = ''
self.spam('Monster')
print self.spam()
spam_button.bind('<Enter>', lambda: self.spam('Ouch'))
def spam(self, spam=None):
if spam != None:
if len(spam) <= 32:
self._spam = spam
else:
return self._spam
Этот метод, вероятно, будет самым коротким, но на первый взгляд сложнее сказатьЯ получаю или настраиваю.
Какой (если таковой имеется) из этих методов предпочтительнее?