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_name
e get_score
um 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_score
mé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 __name
porque o interpretador Python fora da __name
variável mudou _Student__name
, então ainda pode _Student__name
acessar __name
as 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 __name
variável, mas na verdade essa __name
variável e a __name
variável dentro da classe não são uma variável! A __name
variável interna foi alterada automaticamente pelo interpretador Python _Student__name
, e o código externo adiciona uma __name
variável ao bart .