Python // 객체와 클래스
객체 = 속성 + 기능
자동차를 예를 들면
속성은 몸체의 색, 바퀴의 크기, 엔진의 배기량
기능은 전진, 후진, 좌회전, 우회전
속성은 '변수' 기능은 '함수'
객체 = 변수 + 함수
ex) 위의 자동차를 코드로 표현한 것
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #-*-coding:utf-8 -*- color = 0xFF0000 # 몸체의 색 whell_size = 16 # 바퀴의 크기 displacement = 2000 # 엔진 배기량 def forward(): # 전진 pass def backward(): # 후진 pass def turn_left(): # 좌회전 pass def turn_right(): # 우회전 pass |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #-*-coding:utf-8 -*- class Car: color = 0xFF0000 # 몸체의 색 whell_size = 16 # 바퀴의 크기 displacement = 2000 # 엔진 배기량 def forward(self): # 전진 pass def backward(self): # 후진 pass def turn_left(self): # 좌회전 pass def turn_right(self): # 우회전 pass C1=Car() C1.forward() print(C1.color) print(C1.whell_size) |
1 2 3 4 5 6 7 8 9 10 11 12 | class BusinessCard: def set_info(self, name, email, addr): self.name = name self.email = email self.addr = addr def print_info(self): print("--------------------") print("Name: ", self.name) print("E-mail: ", self.email) print("Address: ", self.addr) print("--------------------") |
1 2 | member1 = BusinessCard() member1.set_info("kim", "kim@gmail.com", "USA") |
1 2 3 4 5 6 7 8 9 10 11 12 | class BusinessCard: def __init__(self, name, email, addr): self.name = name self.email = email self.addr = addr def print_info(self): print("--------------------") print("Name: ", self.name) print("E-mail: ", self.email) print("Address: ", self.addr) print("--------------------") |
위처럼 set_info메소드를 __init__으로 바꾸어주기만 하면 된다.
init은 객체가 생성될 때 호출되는 메소드로써, 객체의 초기화를 담당한다.
새로 정의된 BusinessCard 클래스의 생성자는 인자가 4개임을 확인할 수 있다. 물론 첫 번째 인자인 self는 생성되는 인스턴스를 의미하고 자동으로 값이 전달되므로 인스턴스를 생성할 때 명시적으로 인자를 전달해야 하는 것은 3개이다.
따라서 인스턴스를 생성할 때 3개의 인자를 전달해주지 않으면 오류가 발생한다.
1 2 | member1 = BusinessCard('kim','kim@gmail.com','USA') member1.print_info() |
1 2 3 4 5 6 | class Foo: def func1(): print("function 1") def func2(self): print("function 2") |
1 2 3 4 5 | f.func1() Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> f.func1() TypeError: func1() takes 0 positional arguments but 1 was given |
1 2 3 4 5 6 7 8 9 | class Account: num_accounts = 0 def __init__(self, name): self.name = name Account.num_accounts += 1 def __del__(self): Account.num_accounts -= 1 |
Account 클래스에는 생성자와 소멸자가 있다.
생성자 (__init__
)가 클래스의 인스턴스가 생성될 때 자동으로 호출되는 함수라면
소멸자 (__del__
)는 클래스의 인스턴스가 소멸될 때 자동으로 호출되는 함수이다.
Account 클래스에 num_accounts와 같이 클래스 내부에 선언된 변수를 클래스 변수라고 하며, self.name과 같이 self가 붙어 있는 변수를 인스턴스 변수라고 한다.
클래스 변수는 Account 클래스의 네임스페이스에 위치하며, self.name과 같은 인스턴스 변수는 인스턴스의 네임스페이스에 위치하게 됩니다.
그렇다면 언제 클래스 변수를 사용해야 하고 언제 인스턴스 변수를 사용해야 할까?
은행에 가서 계좌를 개설하면 새로운 계좌가 하나 개설된다. 이 상황을 파이썬으로 표현하면 다음과 같이 Account 클래스의 인스턴스를 생성하는 것에 해당한다.
kim = Account("kim") lee = Account("lee")
저장이 잘 되어있는지 출력을 해본다
>>> kim.name 'kim' >>> lee.name 'lee'
그렇다면 지금까지 은행에서 개설된 계좌는 총 몇 개일까?
kim 인스턴스나 lee 인스턴스를 통해 num_accounts라는 이름에 접근하면 총 계좌 개설 개수가 2개로 나오는 것을 알 수 있다.
>>> kim.num_accounts 2 >>> lee.num_accounts 2