에듀테크 프로젝트 대시보드
클래스 기초
class 로 새 타입을 정의합니다. self 는 인스턴스 자신을 가리키는 첫 매개변수입니다.
class Dog:
def __init__(self, name, age): # 생성자 (초기화)
self.name = name # 인스턴스 속성
self.age = age
def bark(self):
return f"{self.name}: 멍!"
d = Dog("바둑이", 3) # __init__ 자동 호출
d.name # => '바둑이'
d.bark() # => 바둑이: 멍!class Dog:
species = "Canis familiaris" # 클래스 변수 — 모든 인스턴스 공유
def __init__(self, name):
self.name = name # 인스턴스마다 별도
Dog.species # 클래스에서 접근
d1 = Dog("A"); d2 = Dog("B")
d1.species # => 'Canis familiaris' (클래스 것 참조)
d1.species = "특별" # d1 에만 새 인스턴스 속성 생성
d2.species # 여전히 원래 값class C: items = [] → 모든 인스턴스가 같은 리스트 공유__init__ 안에서 self.items = []class Counter:
def __init__(self):
self.count = 0
def increment(self, step=1):
self.count += step
return self # 메서드 체이닝 가능하게
c = Counter()
c.increment().increment(5)
c.count # => 6
# c.increment() 는 Counter.increment(c) 로 변환됨class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self): # 개발자용 (디버깅, 리스트 출력)
return f"Point({self.x}, {self.y})"
def __str__(self): # 사용자용 (print)
return f"({self.x}, {self.y})"
p = Point(1, 2)
print(p) # => (1, 2)
p # => Point(1, 2)
[p, p] # => [Point(1, 2), Point(1, 2)]class Account:
def __init__(self, balance):
self.owner = "공개" # public
self._balance = balance # 관례상 내부용 (강제 아님)
self.__pin = "1234" # 이름 맹글링 → _Account__pin
a = Account(100)
a._balance # 접근은 되지만 "쓰지 마세요" 신호
# a.__pin # AttributeError (사실은 a._Account__pin 으로 존재)type(Dog) # => <class 'type'>
Dog.__name__ # => 'Dog'
d = Dog("A")
d.__class__ # => <class 'Dog'>
isinstance(d, Dog) # => True
# 동적으로 속성 추가 (권장은 아님)
d.tricks = ["구르기"]
hasattr(d, "tricks") # => True
getattr(d, "age", 0) # 없으면 기본값