I didn’t understand how the (self) value works in "city.state = self " within the add_city() function

Asked

Viewed 82 times

0

class Estado:

    def __init__(self, nome, sigla):
        self.nome = nome
        self.sigla = sigla
        self.cidades = []

    def adiciona_cidade(self, cidade):
        #essa linha abaixo que eu não entendi o que significa
        cidade.estado = self
        self.cidades.append(cidade)

    def populacao(self):
        #O loop abaixo significa: para cada item de
        #c.populacao (que é: cidade.populacao) em self.cidades.
        return sum([c.populacao for c in self.cidades])

class Cidade:

    def __init__(self, nome, populacao):
        self.nome = nome
        self.populacao = populacao
        self.estado = None

    def __str__(self):
        return "Cidade (nome=%s, populacao=%d, estado=%s)" %(
            self.nome, self.populacao, self.estado)


# Populações obtidas no site da Wikipédia
# IBGE estimativa 2012
am = Estado("Amazonas", "AM")
am.adiciona_cidade(Cidade("Manaus", 1861838))
am.adiciona_cidade(Cidade("Parintins", 103828))
am.adiciona_cidade(Cidade("Itacoatiara", 89064))

sp = Estado("São Paulo", "SP")
sp.adiciona_cidade(Cidade("São Paulo", 11376685))
sp.adiciona_cidade(Cidade("Guarulhos", 1244518))
sp.adiciona_cidade(Cidade("Campinas", 1098630))

rj = Estado("Rio de Janeiro", "RJ")
rj.adiciona_cidade(Cidade("Rio de Janeiro", 6390290))
rj.adiciona_cidade(Cidade("São Gonçalo", 1016128))
rj.adiciona_cidade(Cidade("Duque de Caixias", 867067))


for estado in  [am, sp, rj]:
    print("Estado: %s Sigla: %s" % (estado.nome, estado.sigla))
    for cidade in estado.cidades:
        print("Cidade: %s População: %d" % (cidade.nome, cidade.população))
    print("População do Estado: %d\n" % estado.população())

1 answer

1

The self in Python is equivalent to this existing in Javascript, Java, C++ and others - and concerns the object itself.

In case, you’re seeing the self within a state class method - so the self is the state itself that has to be put into the city. It simply fills this information into the other object (city). .

Unlike other languages, however, the self in Python is explicit: it is received as the first parameter within a method, and in general is called self - and not "appears out of nowhere" as the this in the languages I have quoted. The name "self" is used by convention, and you could use any other name (in the first parameter and in the assignment), that the program would work the same way.

  • So you mean that "city.state = self" means the same thing as: "city.state = State(name, acronym)", that is, city.state receives the State class ("Amazonas", "AM") with the arguments configured when calling the State class? , that’s it?

  • 1

    Yes, that’s it - but without creating a new object - that is, you create an "Amazon" - est = Estado("Amazonas", "AM"), and there you can call the method est.adiciona_cidade for more than one city - they will all have the same Amazon state in their attribute .estado. That is to say when calling est.adiciona_cidade(cid) , that line cidade.estado = self within the method is equivalent to making cidade.estado = est

Browser other questions tagged

You are not signed in. Login or sign up in order to post.