Dados Python versus descritores que não são de dados

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 FileCountque 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 Folderclasse que use o FileCountdescritor:

class Folder:
    count = FileCount()

    def __init__(self, path):
        self.path = pathLinguagem de código:  Python  ( python )

Terceiro, crie uma instância da Folderclasse e acesse o countatributo:

folder = Folder('/')
print('file count: ', folder.count)Linguagem de código:  Python  ( python )

Python chamou o __get__descritor:

The __get__ was called
file count:  32Linguagem de código:  Python  ( python )

Depois disso, defina o countatributo da folderinstância 100e acesse o atributo count:

folder.__dict__['count'] = 100
print('file count: ', folder.count)Linguagem de código:  Python  ( python )

Saída:

file count:  100Linguagem de código:  Python  ( python )

Neste exemplo, Python pode encontrar o countatributo 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 Coordinateclasse 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 Pointclasse que use o Coordinatedescritor:

class Point:
    x = Coordinate()
    y = Coordinate()Linguagem de código:  Python  ( python )

Terceiro, crie uma nova instância da Pointclasse e atribua um valor ao xatributo da pinstância:

p = Point()
p.x = 10Linguagem de código:  Python  ( python )

Saída:

The __set__ was calledLinguagem de código:  Python  ( python )

Python chamou o __set__método do xdescritor.

Por fim, acesse o xatributo da pinstância:

p.xLinguagem de código:  Python  ( python )

Saída:

The __get__ was calledLinguagem de código:  Python  ( python )

Python chamou o __get__método do xdescritor.

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *