2.20. Primeira classe¶
Uma classe agrupa dados e as funções que actuam sobre esses dados sob um único nome. Recorrer a uma classe vale a pena quando várias partes do estado pertencem juntas e a maioria das funções num script recebe esse mesmo conjunto de valores como argumentos.
2.20.1. A palavra-chave class¶
A palavra-chave é class. O corpo contém um método __init__ que é executado sempre que uma nova instância é criada:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Resultado:
3 4
Point é a classe; p é uma instância dela. Os parênteses na chamada Point(3, 4) invocam __init__, que atribui os argumentos a atributos na nova instância. self é o nome convencional para a instância; self.x define um atributo que os restantes métodos da instância irão ler.
2.20.2. Quando usar uma classe¶
Recorra a uma classe quando estas condições se verificam simultaneamente:
Um conjunto de valores relacionados viaja sempre em conjunto (o
xe oyde um ponto; o valor, a unidade e o carimbo de data/hora de uma leitura de sensor).Várias funções recebem esse mesmo conjunto de valores e operam sobre eles.
É útil manter mais do que um destes conjuntos activos ao mesmo tempo, distintos entre si.
Se os dados forem pontuais, um simples dict ou tuple é geralmente suficiente. Se apenas precisar de um único conjunto de constantes, variáveis ao nível do módulo são adequadas. As classes não são o contentor por omissão – elas justificam a sua existência quando o estado e o comportamento querem estar juntos.
2.20.3. O que __init__ faz¶
__init__ é apenas um método regular. Tudo o que é atribuído a self dentro dele torna-se um atributo na nova instância:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Resultado:
temperature C []
readings é inicializado como uma lista vazia – cada nova instância obtém a sua própria lista, não uma partilhada. Tudo o que não for atribuído a self é local a __init__ e desaparece quando ele retorna.