Pergunta

Considere as seguintes definições de classe

class of2010(object):
    def __init__(self):
        self._a = 1
        self._b = 2
        self._c = 3

    def set_a(self,value):
        print('setting a...')
        self._a = value
    def set_b(self,value):
        print('setting b...')
        self._b = value
    def set_c(self,value):
        print('setting c...')
        self._c = value
    a = property(fset=self.set_a)
    b = property(fset=self.set_b)
    c = property(fset=self.set_c)

Observe que set_[a|b|c]() Faça a mesma coisa.existe uma maneira de definir:

def set_magic(self,value):
    print('setting <???>...')
    self._??? = value

uma vez e use-o para a,b,c como segue

a = property(fset=self.set_magic)
b = property(fset=self.set_magic)
c = property(fset=self.set_magic)
Foi útil?

Solução

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'))

Outras dicas

Vejo que seus configuradores apenas registram uma mensagem e simplesmente atribuem o valor - na verdade, sua resposta aceita apenas atribui o valor.Você está usando esse padrão porque é a Prática Aceita/Sabedoria Convencional em algum outro idioma, talvez um cujo nome comece com “J”?Se sim, então aprenda que a abordagem Pythonic para esse mesmo design é muito mais simples:

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

Não há setters que não façam nada, nem chamadas de funções intermediárias apenas para atribuir um valor."O que você diz?"Exposição pública a variáveis ​​de membros? !!" Bem, sim na verdade.

Observe essas classes do ponto de vista do código do cliente.Para usar sua classe, os clientes criam um objeto e atribuem a propriedade "a" usando:

obj = Of2010()
obj.a = 42

Notavelmente, este é exatamente o mesmo código para a classe de 5 linhas que postei acima.

Por que a linguagem J incentiva o estilo de propriedade mais detalhado?Preservar a interface da classe em caso de alterações futuras nos requisitos.Se em algum momento algum outro valor do objeto precisar mudar em conjunto com quaisquer alterações em a, então você deverá implementar o mecanismo de propriedade.Infelizmente, a linguagem J expõe a natureza do mecanismo de acesso a atributos ao código do cliente, de modo que introduzir uma propriedade em algum momento no futuro é uma tarefa de refatoração intrusiva que exigirá uma reconstrução de todos os clientes que fazem uso dessa classe. e seu atributo "a".

Em Python, esse não é o caso.O acesso ao atributo "a" do objeto é determinado em tempo de execução no chamador.Como o acesso direto e o acesso à propriedade "parecem" iguais, sua classe Python preserva essa interface mesmo que o mecanismo real seja diferente.O que importa é que seja idêntico no que diz respeito ao código do cliente.

Assim, em Java, introduz-se esta complexidade de propriedade desde o início desta classe (e de fato, pela Prática Aceita, de todos aulas), na eventualidade de que isso possa ser necessário algum dia no futuro.Com Python, pode-se começar implementando a coisa mais simples que poderia funcionar, ou seja, acesso direto a variáveis ​​de membro simples, deixando a abordagem complexa para o momento futuro em que o material extra for realmente necessário e de valor.Como esse dia pode nunca chegar, este é um grande avanço para lançar a primeira versão funcional do seu código.

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

É isso.

Pode ser que você esteja procurando__setattr__(self, name, value)

Dê uma olhada aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top