Python-público, Protegido, membros privados
linguagens clássicas orientadas a objetos, tais como C++ e Java, controlam o acesso a recursos de classe por palavras-chave públicas, privadas e protegidas. Os membros privados da classe são impedidos de ter acesso do ambiente fora da classe. Eles podem ser manuseados apenas a partir de dentro da classe.
os membros públicos
os membros públicos (geralmente os métodos declarados numa classe) são acessíveis a partir de fora da classe. O objeto da mesma classe é obrigado a invocar um método público. Esta disposição de variáveis de instância privada e métodos públicos garante o princípio da encapsulação de dados.
Todos os membros de uma classe Python são públicos por padrão. Qualquer membro pode ser acessado de fora do ambiente de classe.
Copiar
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
Você pode acessar o Student
classe de atributos e também modificar os seus valores, como mostrado abaixo.
cópia
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
membros protegidos
membros protegidos de uma classe são acessíveis dentro da classe e também estão disponíveis para as suas subcategorias. Nenhum outro ambiente pode ter acesso a ele. Isto permite que recursos específicos da classe-mãe sejam herdados pela classe-criança.
A Convenção de Python para fazer uma variável de instância protegida é adicionar um prefixo _ (sublinhado único) a ele. Isso efetivamente impede que ele seja acessado a menos que seja de dentro de uma sub-classe.
Copy
class Student: _schoolName = 'XYZ School' # protected class attribute def __init__(self, name, age): self._name=name # protected instance attribute self._age=age # protected instance attribute
na verdade, isto não impede que variáveis de instância acedam ou modifiquem a instância. Você ainda pode executar as seguintes operações:
Copiar
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
no Entanto, você pode definir uma propriedade usando a propriedade de decoração e torná-lo protegido, como mostrado abaixo.
Copiar
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
Acima, @propriedade decorador é usado para fazer o name()
método como propriedade e @name.setter
decorador para outro sobrecargas de name()
método como propriedade método setter. Agora, _name
está protegido.
Copiar
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
Acima, usamos std.name
propriedade para modificar _name
atributo. No entanto, ainda é acessível em Python. Assim, o programador responsável se absteria de acessar e modificar variáveis de instância prefixadas com _
de fora de sua classe.
membros privados
Python não tem nenhum mecanismo que restringe o acesso a qualquer variável ou método de instância. Python prescreve uma convenção de prefixação do nome da variável/método com um sublinhado simples ou duplo para emular o comportamento dos especificadores de acesso protegido e privado.
O duplo sublinhado __
prefixado a uma variável torna-o privado. Ele dá uma forte sugestão para não tocá-lo de fora da classe. Qualquer tentativa de fazer isso irá resultar em um AttributeError:
Copiar
class Student: __schoolName = 'XYZ School' # private class attribute def __init__(self, name, age): self.__name=name # private instance attribute self.__salary=age # private instance attribute def __display(self): # private method print('This is private method.')
Copiar
>>> std = Student("Bill", 25)>>> std.__schoolNameAttributeError: 'Student' object has no attribute '__schoolName'>>> std.__nameAttributeError: 'Student' object has no attribute '__name'>>> std.__display()AttributeError: 'Student' object has no attribute '__display'
Python realiza desconfiguração do nome de variáveis privadas. Cada membro com um duplo sublinhado será alterado para _object._class__variable
. Então, ele ainda pode ser acessado de fora da classe, mas a prática deve ser refinada.
Copiar
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
Assim, Python oferece conceitual implementação de public, protected e private modificadores de acesso, mas não é como as outras linguagens como C#, Java, C++.
Leave a Reply