Um objecto de dados só tem estado, não tem comportamento. Ou traduzindo para python: são instâncias de classes sem métodos, apenas com variáveis.
Formas de definir classes de dados.
Auto iniciar locais a partir dos argumentos
É a solução clássica e mais explícita:
class P:
def __init__(self, sln, dll=None, aspnet=None):
self.sln = sln
self.dll = dll
self.aspnet = aspnet
Solução dinâmica
Compacta, python voodoo.
class P:
def __init__(self, sln, dll=None, aspnet=None): self.__dict__.update(locals())
Ou para ser-se pedante
Falta remover o self
do próprio dicionário.
class P:
def __init__(self, sln, dll=None, aspnet=None): self.__dict__.update(locals()); del self.self
E agora uma coisa completamente diferente: namedtuple
Continuando no exemplo acima, mas desta vez sem defaults.
from collections import namedtuple
P = namedtuple("P", "sln dll aspnet".split())
p = P("xpto.sln", "xpto.dll", None)
print p
# recuperando a solucao classica
class Pc:
def __init__(self, sln, dll=None, aspnet=None):
self.sln = sln
self.dll = dll
self.aspnet = aspnet
def __str__(self): return str([self.sln, self.dll, self.aspnet])
p = Pc("xpto.sln", "xpto.dll", None)
print p
Tem como resultado:
P(sln='xpto.sln', dll='xpto.dll', aspnet=None)
['xpto.sln', 'xpto.dll', None]
Resumindo:
- o
namedtuple
fornece uma forma simples e legível de definir objectos de dados simples; - as formas compactas são úteis para prototipagem.