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 Circle
classe tem dois atributos pi
e radius
. Também possui dois métodos que calculam a área e a circunferência de um círculo.
Ambos pi
e radius
são chamados de atributos de instância . Em outras palavras, eles pertencem a uma instância específica da Circle
classe. 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 pi
como 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_attribute
Linguagem de código: Oracle Rules Language ( linguagem de regras )
Nos métodos area()
e circumference()
, acessamos o pi
atributo de classe através da self
variável.
Fora da Circle
classe, você pode acessar o pi
atributo class através de uma instância da Circle
classe ou diretamente através da Circle
classe. Por exemplo:
c = Circle(10)
print(c.pi)
print(Circle.pi)
Linguagem de código: Python ( python )
Saída:
3.14159
3.14159
Linguagem 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 Test
classe 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) # 10
Linguagem de código: Python ( python )
Como funciona.
A Test
classe possui dois atributos com o mesmo nome ( x
), um é o atributo de instância e o outro é um atributo de classe.
Quando acessamos o x
atributo através da instância da Test
classe, ele retorna 20 que é a variável do atributo da instância.
Porém, quando acessamos o x
atributo através da Test
classe, ele retorna 10 que é o valor do x
atributo 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 Circle
classe possui uma pi
constante 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_list
atributo class à Circle
classe. Quando você cria uma nova instância da Circle
classe, 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)) # 2
Linguagem 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 Product
classe. Todas as instâncias da Product
classe terão um desconto padrão especificado pelo default_discount
atributo 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())
# 190
Linguagem 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_attribute
ouobject_name.class_attribute
para acessar o valor doclass_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.