Resumo : neste tutorial, você aprenderá as diferenças entre descritores de dados e não dados.
Os descritores têm dois tipos:
- Descritores de dados são objetos de uma classe que implementa
__set__
método (e/ou__delete__
método) - Descritores que não são de dados são objetos de uma classe que possuem
__get__
apenas o método.
Ambos os tipos de descritores podem opcionalmente implementar o __set_name__
método. O __set_name__
método não afeta a classificação dos descritores.
Os tipos de descritores determinam como o Python resolve a pesquisa de atributos do objeto.
Descritor sem dados
Se uma classe usar um descritor que não seja de dados, o Python pesquisará primeiro o atributo nos atributos de instância ( instance.__dict__
). Se o Python não encontrar o atributo nos atributos da instância, ele usará o descritor de dados.
Vamos dar uma olhada no exemplo a seguir.
Primeiro, defina uma classe descritora que não seja de dados FileCount
que possua o __get__
método que retorna o número de arquivos em uma pasta:
class FileCount:
def __get__(self, instance, owner):
print('The __get__ was called')
return len(os.listdir(instance.path))
Linguagem de código: Python ( python )
Segundo, defina uma Folder
classe que use o FileCount
descritor:
class Folder:
count = FileCount()
def __init__(self, path):
self.path = path
Linguagem de código: Python ( python )
Terceiro, crie uma instância da Folder
classe e acesse o count
atributo:
folder = Folder('/')
print('file count: ', folder.count)
Linguagem de código: Python ( python )
Python chamou o __get__
descritor:
The __get__ was called
file count: 32
Linguagem de código: Python ( python )
Depois disso, defina o count
atributo da folder
instância 100
e acesse o atributo count:
folder.__dict__['count'] = 100
print('file count: ', folder.count)
Linguagem de código: Python ( python )
Saída:
file count: 100
Linguagem de código: Python ( python )
Neste exemplo, Python pode encontrar o count
atributo no dicionário da instância __dict__
. Portanto, não utiliza descritores de dados.
Descritor de dados
Quando uma classe tem um descritor de dados, o Python procurará primeiro o atributo de uma instância no descritor de dados. Se o Python não encontrar o atributo, ele procurará o atributo no dicionário de instância ( __dict__
). Por exemplo:
Primeiro, defina uma Coordinate
classe de descritor:
class Coordinate:
def __get__(self, instance, owner):
print('The __get__ was called')
def __set__(self, instance, value):
print('The __set__ was called')
Linguagem de código: Python ( python )
Segundo, defina uma Point
classe que use o Coordinate
descritor:
class Point:
x = Coordinate()
y = Coordinate()
Linguagem de código: Python ( python )
Terceiro, crie uma nova instância da Point
classe e atribua um valor ao x
atributo da p
instância:
p = Point()
p.x = 10
Linguagem de código: Python ( python )
Saída:
The __set__ was called
Linguagem de código: Python ( python )
Python chamou o __set__
método do x
descritor.
Por fim, acesse o x
atributo da p
instância:
p.x
Linguagem de código: Python ( python )
Saída:
The __get__ was called
Linguagem de código: Python ( python )
Python chamou o __get__
método do x
descritor.
Resumo
- Descritores de dados são objetos de uma classe que implementa
__set__
método (e/ou__delete__
método) - Descritores que não são de dados são objetos de uma classe que possuem
__get__
apenas o método. - Ao acessar os atributos do objeto, os descritores de dados substituem os atributos da instância e os atributos da instância substituem os descritores que não são de dados.