Atributos da Classe e Métodos Estáticos - Python
Atributos de Classe
Além dos atributos específicos de cada objeto, é possível definir atributos de classe. Esses atributos são variáveis declaradas no nível do próprio classe e compartilhadas por todos os objetos dela. Por exemplo:
class Person:
type = "Person"
description = "Describes a person"
print(Person.type) # Person
print(Person.description) # Describes a person
Person.type = "Class Person"
print(Person.type) # Class Person
Neste exemplo, a classe Person
type
description
Person.type
Esses atributos são compartilhados por todos os objetos da classe:
class Person:
type = "Person"
def __init__(self, name):
self.name = name
tom = Person("Tom")
bob = Person("Bob")
print(tom.type) # Person
print(bob.type) # Person
# Alterando o atributo de classe
Person.type = "Class Person"
print(tom.type) # Class Person
print(bob.type) # Class Person
Os atributos de classe são úteis quando queremos definir valores padrão para todos os objetos da classe. Por exemplo:
class Person:
default_name = "Undefined Name"
def __init__(self, name):
self.name = name if name else Person.default_name
tom = Person("Tom")
bob = Person("")
print(tom.name) # Tom
print(bob.name) # Undefined Name
Neste caso, o atributo default_name
default_name
name
Person.default_name
Atributo de Classe e Atributo de Objeto com o Mesmo Nome
Pode ocorrer que um atributo de classe e um atributo de objeto tenham o mesmo nome. Quando o atributo do objeto não tem um valor atribuído, o valor do atributo de classe será utilizado:
class Person:
name = "Undefined Name"
def print_name(self):
print(self.name)
tom = Person()
bob = Person()
tom.print_name() # Undefined Name
bob.print_name() # Undefined Name
bob.name = "Bob"
bob.print_name() # Bob
tom.print_name() # Undefined Name
Neste exemplo, print_name
name
tom
name
name
bob
Se o valor do atributo de classe for alterado, o atributo name
Person.name = "Some Person"
bob.name = "Bob"
bob.print_name() # Bob
tom.print_name() # Some Person
Aqui, bob
name
tom
Métodos Estáticos
Além dos métodos comuns, uma classe também pode definir métodos estáticos. Estes são precedidos pelo decorador @staticmethod
class Person:
__type = "Person"
@staticmethod
def print_type():
print(Person.__type)
Person.print_type() # Person - chamado através do nome da classe
tom = Person()
tom.print_type() # Person - chamado através de um objeto
Neste exemplo, a classe Person
__type
O método estático print_type
__type