Variáveis ​​de classe Python

Resumo : neste tutorial, você aprenderá como funcionam as variáveis ​​​​(ou atributos) da classe Python.

Introdução às variáveis ​​de classe Python

Tudo em Python é um objeto incluindo uma classe . Em outras palavras, uma classe é um objeto em Python.

Quando você define uma classe usando a classpalavra-chave, Python cria um objeto com o mesmo nome da classe. Por exemplo:

class HtmlDocument:
   passLinguagem de código:  Python  ( python )

Este exemplo define a HtmlDocumentclasse e o HtmlDocumentobjeto. O HtmlDocumentobjeto tem a __name__propriedade:

print(HtmlDocument.__name__) # HtmlDocumentLinguagem de código:  Python  ( python )

E HTMLDocumenttem o tipo de type:

print(type(HtmlDocument))  # <class 'type'>Linguagem de código:  Python  ( python )

Também é uma instância da typeclasse:

print(isinstance(HtmlDocument, type)) # TrueLinguagem de código:  Python  ( python )

Variáveis ​​de classe estão vinculadas à classe. Eles são compartilhados por todas as instâncias dessa classe.

O exemplo a seguir adiciona as variáveis ​​de classe extensione versionà HtmlDocumentclasse:

class HtmlDocument:
    extension = 'html'
    version = '5'Linguagem de código:  Python  ( python )

Ambos extensione versionsão as variáveis ​​de classe da HtmlDocumentclasse. Eles estão vinculados à HtmlDocumentclasse.

Obtenha os valores das variáveis ​​de classe

Para obter os valores das variáveis ​​de classe, você usa a notação de ponto ( .). Por exemplo:

print(HtmlDocument.extension) # html
print(HtmlDocument.version) # 5Linguagem de código:  Python  ( python )

Se você acessar uma variável de classe que não existe, receberá uma AttributeErrorexceção. Por exemplo:

HtmlDocument.media_typeLinguagem de código:  Python  ( python )

Erro:

AttributeError: type object 'HtmlDocument' has no attribute 'media_type'Linguagem de código:  Python  ( python )

Outra maneira de obter o valor de uma variável de classe é usar a getattr()função. A getattr()função aceita um objeto e um nome de variável. Ele retorna o valor da variável de classe. Por exemplo:

extension = getattr(HtmlDocument, 'extension')
version = getattr(HtmlDocument, 'version')

print(extension)  # html
print(version)  # 5Linguagem de código:  Python  ( python )

Se a variável de classe não existir, você também receberá uma AttributeErrorexceção. Para evitar a exceção, você pode especificar um valor padrão se a variável de classe não existir assim:

media_type = getattr(HtmlDocument, 'media_type', 'text/html')
print(media_type) # text/htmlLinguagem de código:  Python  ( python )

Definir valores para variáveis ​​de classe

Para definir um valor para uma variável de classe, você usa a notação de ponto:

HtmlDocument.version = 10Linguagem de código:  Python  ( python )

ou você pode usar a setattr()função integrada:

setattr(HtmlDocument, 'version', 10)Linguagem de código:  Python  ( python )

Como Python é uma linguagem dinâmica, você pode adicionar uma variável de classe a uma classe em tempo de execução após criá-la. Por exemplo, o seguinte adiciona a media_typevariável de classe à HtmlDocumentclasse:

HtmlDocument.media_type = 'text/html'
print(HtmlDocument.media_type)Linguagem de código:  Python  ( python )

Da mesma forma, você pode usar a setattr()função:

setattr(HtmlDocument, media_type, 'text/html')
print(HtmlDocument.media_type)Linguagem de código:  Python  ( python )

Excluir variáveis ​​de classe

Para excluir uma variável de classe em tempo de execução, você usa a delattr()função:

delattr(HtmlDocument, 'version')Linguagem de código:  Python  ( python )

Ou você pode usar a delpalavra-chave:

del HtmlDocument.versionLinguagem de código:  Python  ( python )

Armazenamento variável de classe

Python armazena variáveis ​​de classe no __dict__atributo. O __dict__é um proxy de mapeamento, que é um dicionário. Por exemplo:

from pprint import pprint


class HtmlDocument:
    extension = 'html'
    version = '5'


HtmlDocument.media_type = 'text/html'

pprint(HtmlDocument.__dict__)Linguagem de código:  Python  ( python )

Saída:

mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>,
              '__doc__': None,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>,
              'extension': 'html',
              'media_type': 'text/html',
              'version': '5'})Linguagem de código:  Python  ( python )

Conforme mostrado claramente na saída, __dict__possui três variáveis ​​de classe: extension, media_typee versionalém de outras variáveis ​​de classe predefinidas.

Python não permite que você altere __dict__diretamente. Por exemplo, o seguinte resultará em um erro:

HtmlDocument.__dict__['released'] = 2008Linguagem de código:  Python  ( python )

Saída:

TypeError: 'mappingproxy' object does not support item assignmentLinguagem de código:  Python  ( python )

No entanto, você pode usar a setattr()notação de função ou ponto para alterar indiretamente o __dict__atributo.

Além disso, a chave de __dict__são strings que ajudarão o Python a acelerar a pesquisa de variáveis.

Embora o Python permita acessar variáveis ​​de classe através do __dict__dicionário, não é uma boa prática. Além disso, não funcionará em algumas situações. Por exemplo:

print(HtmlDocument.__dict__['type']) # BAD CODELinguagem de código:  Python  ( python )

Atributos de classe que podem ser chamados

Os atributos de classe podem ser qualquer objeto, como uma função.

Quando você adiciona uma função a uma classe, a função se torna um atributo de classe. Como uma função pode ser chamada, o atributo de classe é chamado de atributo de classe que pode ser chamado. Por exemplo:

from pprint import pprint


class HtmlDocument:
    extension = 'html'
    version = '5'

    def render():
        print('Rendering the Html doc...')


pprint(HtmlDocument.__dict__)Linguagem de código:  Python  ( python )

Saída:

mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>,
              '__doc__': None,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>,
              'extension': 'html',
              'render': <function HtmlDocument.render at 0x0000010710030310>,
              'version': '5'})
Rendering the Html doc...Linguagem de código:  Python  ( python )

Neste exemplo, the renderé um atributo de classe da HtmlDocumentclasse. Seu valor é uma função.

Resumo

  • Uma classe é um objeto que é uma instância da classe de tipo.
  • Variáveis ​​de classe são atributos do objeto de classe.
  • Use notação de ponto ou getattr()função para obter o valor de um atributo de classe.
  • Use notação de ponto ou setattr()função para definir o valor de um atributo de classe.
  • Python é uma linguagem dinâmica. Portanto, você pode atribuir uma variável de classe a uma classe em tempo de execução.
  • Python armazena variáveis ​​de classe no __dict__atributo. O __dict__atributo é um dicionário.

Deixe um comentário

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