Atributos de classe Python

Resumo : neste tutorial, você aprenderá sobre os atributos da classe Python e quando usá-los adequadamente.

Introdução aos atributos de classe

Vamos começar com uma Circle aula simples :

class Circle:
    def __init__(self, radius):
        self.pi = 3.14159
        self.radius = radius

    def area(self):
        return self.pi * self.radius**2

    def circumference(self):
        return 2*self.pi * self.radius
Linguagem de código:  Python  ( python )

A Circleclasse tem dois atributos pie radius. Também possui dois métodos que calculam a área e a circunferência de um círculo.

Ambos pie radiussão chamados de atributos de instância . Em outras palavras, eles pertencem a uma instância específica da Circleclasse. Se você alterar os atributos de uma instância, isso não afetará outras instâncias.

Além dos atributos de instância, o Python também suporta atributos de classe . Os atributos de classe não estão associados a nenhuma instância específica da classe. Mas eles são compartilhados por todas as instâncias da classe.

Se você estiver programando em Java ou C#, verá que os atributos de classe são semelhantes aos membros estáticos, mas não iguais.

Para definir um atributo de classe, coloque-o fora do __init__()método. Por exemplo, o seguinte define picomo um atributo de classe:

class Circle:
    pi = 3.14159

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return self.pi * self.radius**2

    def circumference(self):
        return 2 * self.pi * self.radius
Linguagem de código:  Python  ( python )

Depois disso, você pode acessar o atributo class através de instâncias da classe ou através do nome da classe:

object_name.class_attribute
class_name.class_attributeLinguagem de código:  Oracle Rules Language  ( linguagem de regras )

Nos métodos area()e circumference(), acessamos o piatributo de classe através da selfvariável.

Fora da Circleclasse, você pode acessar o piatributo class através de uma instância da Circleclasse ou diretamente através da Circleclasse. Por exemplo:

c = Circle(10)
print(c.pi)
print(Circle.pi)Linguagem de código:  Python  ( python )

Saída:

3.14159
3.14159Linguagem de código:  Python  ( python )

Como funcionam os atributos de classe Python

Quando você acessa um atributo por meio de uma instância da classe, o Python procura o atributo na lista de atributos da instância. Se a lista de atributos da instância não tiver esse atributo, o Python continuará procurando o atributo na lista de atributos da classe. Python retorna o valor do atributo desde que encontre o atributo na lista de atributos de instância ou na lista de atributos de classe.

No entanto, se você acessar um atributo, o Python pesquisará diretamente o atributo na lista de atributos da classe.

O exemplo a seguir define uma Testclasse para demonstrar como o Python lida com atributos de instância e classe.

class Test:
    x = 10

    def __init__(self):
        self.x = 20


test = Test()
print(test.x)  # 20
print(Test.x)  # 10Linguagem de código:  Python  ( python )

Como funciona.

A Testclasse possui dois atributos com o mesmo nome ( x), um é o atributo de instância e o outro é um atributo de classe.

Quando acessamos o xatributo através da instância da Testclasse, ele retorna 20 que é a variável do atributo da instância.

Porém, quando acessamos o xatributo através da Testclasse, ele retorna 10 que é o valor do xatributo da classe.

Quando usar atributos de classe Python

Os atributos de classe são úteis em alguns casos, como armazenamento de constantes de classe, rastreamento de dados em todas as instâncias e definição de valores padrão.

1) Armazenando constantes de classe

Como uma constante não muda de instância para instância de uma classe, é útil armazená-la como um atributo de classe.

Por exemplo, a Circleclasse possui uma piconstante que é a mesma para todas as instâncias da classe. Portanto, é um bom candidato para os atributos de classe.

2) Rastreamento de dados em todas as instâncias

O seguinte adiciona o circle_listatributo class à Circleclasse. Quando você cria uma nova instância da Circleclasse, o construtor adiciona a instância à lista:

class Circle:
    circle_list = []
    pi = 3.14159

    def __init__(self, radius):
        self.radius = radius
        # add the instance to the circle list
        self.circle_list.append(self)

    def area(self):
        return self.pi * self.radius**2

    def circumference(self):
        return 2 * self.pi * self.radius


c1 = Circle(10)
c2 = Circle(20)

print(len(Circle.circle_list))  # 2Linguagem de código:  Python  ( python )

3) Definindo valores padrão

Às vezes, você deseja definir um valor padrão para todas as instâncias de uma classe. Nesse caso, você pode usar um atributo de classe.

O exemplo a seguir define uma Productclasse. Todas as instâncias da Productclasse terão um desconto padrão especificado pelo default_discountatributo class:

class Product:
    default_discount = 0

    def __init__(self, price):
        self.price = price
        self.discount = Product.default_discount

    def set_discount(self, discount):
        self.discount = discount

    def net_price(self):
        return self.price * (1 - self.discount)


p1 = Product(100)
print(p1.net_price())
 # 100

p2 = Product(200)
p2.set_discount(0.05)
print(p2.net_price())
 # 190Linguagem de código:  Python  ( python )

Resumo

  • Um atributo de classe é compartilhado por todas as instâncias da classe. Para definir um atributo de classe, coloque-o fora do __init__()método.
  • Use class_name.class_attributeou object_name.class_attributepara acessar o valor do class_attribute.
  • Use atributos de classe para armazenar contantes de classe, rastrear dados em todas as instâncias e definir valores padrão para todas as instâncias da classe.

Deixe um comentário

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