تفاوت Attributeهای کلاس و Attributeهای یک شیء (Object)
در پایتون، هر کلاس و هر شیء (نمونه کلاس) میتواند ویژگیها (attributes) داشته باشد. اما این ویژگیها در دو سطح مختلف تعریف میشوند:
1. Attributeهای کلاس (Class Attributes)
ویژگیهایی هستند که مستقیماً در کلاس تعریف میشوند و بین تمام نمونههای آن کلاس مشترک هستند. این ویژگیها به همه اشیاء تعلق دارند و تغییر آن در یک جا، روی همه اشیاء تاثیر میگذارد.
class Dog:
species = "Canis familiaris" # Class attribute
def __init__(self, name):
self.name = name # Object attribute
dog1 = Dog("Fido")
dog2 = Dog("Buddy")
print(dog1.species) # Canis familiaris
print(dog2.species) # Canis familiaris
Dog.species = "Modified species"
print(dog1.species) # Modified species
print(dog2.species) # Modified species
2. Attributeهای شیء (Object Attributes)
این ویژگیها مختص هر شیء هستند و در متد __init__
یا به صورت جداگانه به هر شیء اختصاص داده میشوند. تغییر در ویژگی یک شیء، روی اشیاء دیگر تاثیری ندارد.
dog1.name = "Fido"
dog2.name = "Buddy"
print(dog1.name) # Fido
print(dog2.name) # Buddy
dog1.name = "Max"
print(dog1.name) # Max
print(dog2.name) # Buddy
خلاصه تفاوتها:
- Attributeهای کلاس برای همه نمونهها یکسان است و در سطح کلاس تعریف میشود.
- Attributeهای شیء مخصوص همان نمونه است و میتواند برای هر شیء مقدار متفاوتی داشته باشد.
- دسترسی به Attributeهای کلاس هم از طریق کلاس و هم از طریق نمونهها ممکن است، اما تغییر در آن از طریق نمونه معمولاً فقط آن نمونه را تغییر میدهد (در صورتی که صریحاً به آن مقدار داده شود).