Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Instance vs. Class Attributes | Class Structures
Object Oriented Programming with Python

Instance vs. Class Attributes

Deslize para mostrar o menu

Understanding the distinction between instance and class attributes is fundamental to mastering Python class structures. Namespacing plays a central role in this difference. Each object in Python has its own namespace for instance attributes, which are typically set inside the __init__ method using self. This means that when you assign a value to an attribute via self.attribute, that data is stored in the individual object's memory space. As a result, changes to an instance attribute only affect that particular object.

On the other hand, class attributes are defined directly in the class body, outside any methods. These attributes are stored in the class's namespace and are shared across all instances of the class. When you access a class attribute via an instance, Python first checks the instance's namespace; if the attribute is not found, it looks in the class's namespace. This is why modifying a class attribute through the class itself updates the value for all instances that have not overridden the attribute with their own instance-specific value. In contrast, if you assign a new value to what looks like a class attribute via an instance (e.g., instance.attribute = value), Python creates a new instance attribute, shadowing the class attribute for that particular object.

This separation in memory allocation and attribute lookup explains why class attributes can be used for data that should be consistent across all objects - such as configuration flags or counters - while instance attributes are ideal for storing data unique to each object.

12345678910111213141516171819
class User: # Class attribute: shared across all instances user_count = 0 def __init__(self, name): # Instance attribute: unique to each instance self.name = name User.user_count += 1 # Create two users with different names alice = User("Alice") bob = User("Bob") print(f"Alice's name: {alice.name}") print(f"Bob's name: {bob.name}") # Both instances see the same class attribute print(f"Total users: {alice.user_count}") print(f"Total users: {bob.user_count}")

Changing the class attribute through the class affects all instances:

123
User.user_count = 10 print(f"Total users after update: {alice.user_count}") print(f"Total users after update: {bob.user_count}")

Assigning to the class attribute via an instance creates a new instance attribute:

123
alice.user_count = 99 print(f"Alice's user_count: {alice.user_count}") print(f"Bob's user_count: {bob.user_count}")
Note
Definition

The unit attribute is a class attribute that defines the unit of measurement used for all calculations.

  • In the code you can call it by: self.__class__.unit.
1234567891011121314151617181920
class Measurement: # Class attribute for unit of measurement unit = "meters" def __init__(self, value): self.value = value def describe(self): # Access the class attribute using self.__class__.unit return f"{self.value} {self.__class__.unit}" # Create the measurement length = Measurement(5) print(length.describe()) # Change the class attribute Measurement.unit = "centimeters" print(length.describe())

The unit class attribute is commonly used to define a shared property that applies to all instances of a class. For example, if you have a Measurement class representing values in a specific unit (such as meters or kilograms), you can set the unit as a class attribute. This way, every instance of Measurement will use the same unit unless you explicitly override it for a particular instance. Accessing the class attribute can be done through the class itself (e.g., Measurement.unit) or from an instance using self.__class__.unit. This approach ensures consistency and avoids duplication when the attribute should be the same for all objects.

1. What is the primary difference between instance attributes and class attributes in Python?

2. What happens when you assign a value to a class attribute via an instance?

question mark

What is the primary difference between instance attributes and class attributes in Python?

Selecione a resposta correta

question mark

What happens when you assign a value to a class attribute via an instance?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 1. Capítulo 5
some-alt