Tutorial Python orientado a objetos: restrições de acesso

Dentro da classe, pode haver atributos e métodos, e o código externo pode manipular os dados chamando diretamente o método das variáveis ​​de instância, de forma que a lógica complexa interna seja ocultada.

Se você quiser evitar que atributos internos sejam acessados ​​externamente, você pode adicionar dois sublinhados antes do nome do atributo __. Em Python, se o nome da variável de uma instância __começa com, ele se torna uma variável privada (privada), que só pode ser acessado internamente. Sem acesso externo.

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))
bar = Student("Mike",90)
print(bar.__name)

Resultado:

Traceback (most recent call last):
  File "E:/ru/231n/exer.py", line 11, in <module>
    print(bar.__name)
AttributeError: 'Student' object has no attribute '__name'

Isso garante que o código externo não possa modificar o estado interno do objeto à vontade, de modo que o código seja mais robusto por meio da proteção de restrições de acesso.

Se o código externo para obter nome e pontuação, pode ser adicionado à classe Aluno get_namee get_scoreum método:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def get_name(self):
    return self.__name

def get_score(self):
    return self.__score

Se quiser permitir que um código externo modifique a pontuação, você pode adicionar set_scoremétodos à classe Aluno :

def set_score(self, score):
    self.__score = score

Sublinhado duplo não é o início das variáveis ​​de instância não deve ser acessado não diretamente acessível de fora __nameporque o interpretador Python fora da __namevariável mudou _Student__name, então ainda pode _Student__nameacessar __nameas variáveis:

print(bar._Student__name) #Mike

Deve-se notar que em Python, os nomes das variáveis ​​são semelhantes __xxx__, ou seja, aqueles que começam com um sublinhado duplo e terminam com um sublinhado duplo são variáveis ​​especiais.Variáveis ​​especiais podem ser acessadas diretamente, não variáveis ​​privadas.

Nomes de variáveis ​​de instância que começam com um sublinhado, como _name, são acessíveis fora dessas variáveis ​​de instância. No entanto, de acordo com as regras convencionais, quando você vê essa variável, significa: "Embora eu possa ser acessado, mas, por favor, trate-me como uma variável privada, não acesse à vontade ”.

Tenha cuidado para evitar os seguintes erros:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
bar.__name = "Tom"
print(bar.__name) #Tom
print(bar.get_name()) #Mike

Superficialmente, o código externo "com sucesso" definiu a __namevariável, mas na verdade essa __namevariável e a __namevariável dentro da classe não são uma variável! A __namevariável interna foi alterada automaticamente pelo interpretador Python _Student__name, e o código externo adiciona uma __namevariável ao bart .

Acho que você gosta

Origin blog.csdn.net/qdPython/article/details/112572957
Recomendado
Clasificación