파이썬 - 클래스 어트리뷰트
안녕하세요, 잠재력을 가진 프로그래머 여러분! 오늘은 파이썬 클래스 어트리뷰트의 흥미로운 세계에 빠지게 될 것입니다. 프로그래밍에 새로운 사람이라도 걱정하지 마세요; 저는 수년간 학생들을 가르쳐 왔던 것처럼, 단계별로 여러분을 이 여정을 안내해 드릴 것입니다. 그럼, 시작해보겠습니다!
클래스 어트리뷰트 (변수)
클래스 어트리뷰트는 클래스의 특정 인스턴스가 아니라 전체 클래스에 속하는 변수입니다. 이들은 해당 클래스의 모든 객체가 공유하는 특성으로 생각할 수 있습니다.
간단한 예시를 통해 시작해보겠습니다:
class Dog:
species = "Canis familiaris"
def __init__(self, name, age):
self.name = name
self.age = age
fluffy = Dog("Fluffy", 3)
buddy = Dog("Buddy", 5)
print(Dog.species) # 출력: Canis familiaris
print(fluffy.species) # 출력: Canis familiaris
print(buddy.species) # 출력: Canis familiaris
이 예시에서, species
는 클래스 어트리뷰트입니다. 이는 클래스 내에 직접 정의되지만, 어떤 메서드에도 속하지 않습니다. 모든 Dog
객체는 이 어트리뷰트를 공유합니다.
클래스 어트리뷰트 접근
위의 예시에서 볼 수 있듯이, 클래스 어트리뷰트에 접근할 수 있는 두 가지 방법이 있습니다:
- 클래스 자체를 통해:
Dog.species
- 클래스의 어떤 인스턴스를 통해:
fluffy.species
또는buddy.species
두 가지 방법 모두 같은 결과를 줄 것입니다. "개의 종류는 무엇인가?" 또는 "Fluffy는 무엇인가?"라고 묻는 것과 같습니다 - 답은 같습니다!
클래스 어트리뷰트 수정
클래스 어트리뷰트는 수정할 수 있지만, 주의하세요! 클래스 어트리뷰트를 수정하면, 클래스의 모든 인스턴스에 영향을 줄 것입니다. 예를 들어보겠습니다:
class Cat:
species = "Felis catus"
count = 0
def __init__(self, name):
self.name = name
Cat.count += 1
whiskers = Cat("Whiskers")
mittens = Cat("Mittens")
print(Cat.count) # 출력: 2
print(whiskers.count) # 출력: 2
print(mittens.count) # 출력: 2
Cat.species = "Felis silvestris catus"
print(Cat.species) # 출력: Felis silvestris catus
print(whiskers.species) # 출력: Felis silvestris catus
print(mittens.species) # 출력: Felis silvestris catus
이 예시에서, 우리는 count
라는 클래스 어트리뷰트를 사용하여 생성된 고양이의 수를 추적합니다. 새로운 Cat
객체를 생성할 때마다, 우리는 Cat.count
를 증가시킵니다. 또한, Cat.species
를 수정하여 모든 고양이의 종을 한 번에 변경했습니다.
클래스 어트리뷰트의 중요성
클래스 어트리뷰트는 여러 시나리오에서 매우 유용합니다:
- 클래스의 모든 인스턴스에 대해 같아야 하는 상수를 저장합니다.
- 클래스의 모든 인스턴스에 걸쳐 데이터를 추적합니다 (우리의
Cat.count
예시와 같습니다). - 필요시 인스턴스에서 재정의할 수 있는 기본 값들을 정의합니다.
내장 클래스 어트리뷰트
파이썬 클래스는 몇 가지 유용한 내장 어트리뷰트를 제공합니다. 몇 가지를 살펴보겠습니다:
class MyClass:
x = 5
def my_method(self):
pass
print(MyClass.__name__) # 출력: MyClass
print(MyClass.__doc__) # 출력: None (因为我们没有提供文档字符串)
print(MyClass.__dict__) # 출력: {'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__) # 출력: __main__
내장 클래스 어트리뷰트 접근
여기是一些常见的내장 클래스 어트리뷰트와 접근 방법에 대한 표입니다:
어트리뷰트 | 설명 | 접근 |
---|---|---|
name | 클래스의 이름 | MyClass.name |
doc | 클래스의 독스트링 | MyClass.doc |
dict | 클래스의 이름 공간을 포함하는 딕셔너리 | MyClass.dict |
module | 클래스가 정의된 모듈의 이름 | MyClass.module |
bases | 베이스 클래스를 포함하는 튜플 | MyClass.bases |
인스턴스 어트리뷰트
이제 우리는 클래스 어트리뷰트를 이해했으므로, 차이를 보기 위해 인스턴스 어트리뷰트에 간단히 대봅시다. 인스턴스 어트리뷰트는 클래스에서 생성된 각 객체에 특정한 것입니다.
class Student:
school = "Python High" # 클래스 어트리뷰트
def __init__(self, name, grade):
self.name = name # 인스턴스 어트리뷰트
self.grade = grade # 인스턴스 어트리뷰트
alice = Student("Alice", 10)
bob = Student("Bob", 11)
print(Student.school) # 출력: Python High
print(alice.school) # 출력: Python High
print(bob.school) # 출력: Python High
print(alice.name) # 출력: Alice
print(bob.name) # 출력: Bob
Student.school = "Python University"
print(alice.school) # 출력: Python University
print(bob.school) # 출력: Python University
alice.school = "Python Elementary"
print(alice.school) # 출력: Python Elementary
print(Student.school) # 출력: Python University
print(bob.school) # 출력: Python University
인스턴스 어트리뷰트 Vs 클래스 어트리뷰트
인스턴스와 클래스 어트리뷰트 간의 주요 차이점은 다음과 같습니다:
- 클래스 어트리뷰트는 모든 인스턴스가 공유하지만, 인스턴스 어트리뷰트는 각 인스턴스에 고유한 것입니다.
- 클래스 어트리뷰트는 클래스 내에 정의되지만, 어떤 메서드에도 속하지 않습니다. 반면, 인스턴스 어트리뷰트는 일반적으로
__init__
메서드 내에 정의됩니다. - 클래스 어트리뷰트를 변경하면 모든 인스턴스에 영향을 줄 것입니다 (인스턴스가 그것을 재정의하지 않은 경우), 반면 인스턴스 어트리뷰트를 변경하면 오직 해당 인스턴스에만 영향을 줍니다.
기억해주세요, 인스턴스에서 어트리뷰트에 접근하려고 시도할 때, 파이썬은 먼저 인스턴스 어트리뷰트를 찾습니다. 그것을 못 찾으면, 클래스 어트리뷰트를 찾습니다. 이러한 이유로, 우리는 클래스 어트리뷰트를 특정 인스턴스에게 "재정의"할 수 있습니다.
그리고 그렇게 하면 됩니다! 여러분은 파이썬 클래스 어트리뷰트에 대한 급습 과정을 마친 것입니다. 프로그래밍을 마스터하는 키는 연습입니다. 그래서 эти 개념들을 실험해 보세요. 여러분 자신의 클래스를 만들고, 어트리뷰트를 놀리며, 무슨 일이 일어나는지 확인해 보세요. 코딩 잘 하세요!
Credits: Image by storyset