1
resposta

Duvidas entre os atributos privados(mangling) da classe Mãe

Olá, ao reutilizar o código apenas atribuindo os atributos privados na classe Mãe, percebi que consigo ainda utilizar o atributo como mangling, sem afetar o código.

Nesse caso, qual seria o problema, após aderir a superclasse, a utilização do mangling na classe mãe(__nome), ao invés do (_nome)?

class Programa:
    def __init__(self,nome, ano):
        self.__nome     = nome.title()
        self.ano        = ano
        self.__likes    = 0

    @property
    def nome(self):
        return self.__nome

    @nome.setter
    def nome(self, novo_nome):
        self.__nome = novo_nome.title()

    @property
    def likes(self):
        return self.__likes

    def dar_like(self):
        self.__likes += 1

class Filme(Programa):
    def __init__(self,nome, ano, duracao):
        super(). __init__(nome,ano)
        self.duracao    = duracao
1 resposta

Oiii Anderson, como você está?

Sinto muito pela demora em obter um retorno.

Ao utilizar o name mangling na classe mãe, diretamente você não conseguirá usar os atributos com duplo undercore na classe filha, pois os atributos que possuem essa característica são visíveis apenas dentro da classe. Para acessá-los fora da classe precisamos utilizar a seguinte sintaxe: _nomedaclasse__atributo. Por exemplo, caso seja necessário substituirmos o valor do atributo __likes na classe filha para que comece com o valor 3, precisamos utilizar a seguinte sintaxe:

class Filme(Programa):
    def __init__(self,nome, ano, duracao):
        super(). __init__(nome,ano)
        self.duracao    = duracao
        self._Programa__likes = 3

Porém, se utilizássemos o single underscore na classe mãe para o atributo likes (_likes), para fazermos a substituição basta chamarmos o atributo da mesma forma como ele foi escrito na classe mãe. Por exemplo:

class Filme(Programa):
    def __init__(self,nome, ano, duracao):
        super(). __init__(nome,ano)
        self.duracao    = duracao
        self._likes = 4

A prática de utilizar o name mangling é para que os atributos sejam de difícil acesso, pois diretamente não conseguiremos manipulá-los fora da classe, apenas se tivermos o conhecimento de como internamente o python irá alterá-los, como mostrei acima. Mas, a linguagem Python não oferece suporte a atributos estritamente privados, sempre há como "burlar".

Qualquer dúvida estou por aqui, tá bom?

Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software