파이썬과 객체지향 프로그래밍 - 예제로 이해하는 객체지향 문법 (생성자와 소멸자 메서드)

4. 예제로 이해하는 객체지향 문법 (생성자와 소멸자 메서드)

  • 생성자는 객체 생성시 자동 호출, 소멸자는 객체 소멸시 자동 호출

생성자: __init__(self)

  • method 이므로 첫 번째 인자는 self로 설정
  • 생성자에서는 보통 해당 클래스가 다루는 데이터를 정의

이전에 다음과 같이 attribute 선언해보았음

In [44]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"
In [43]:
square = Quadrangle()

다음과 같이 클래스에서 self.attribute명을 사용할 수는 없음 (self는 객체를 나타냄)

In [45]:
class Quadrangle:
    self.width = 0
    self.height = 0
    self.color = "black"
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-45-c2dd94dcbb71> in <module>()
----> 1 class Quadrangle:
      2     self.width = 0
      3     self.height = 0
      4     self.color = "black"

<ipython-input-45-c2dd94dcbb71> in Quadrangle()
      1 class Quadrangle:
----> 2     self.width = 0
      3     self.height = 0
      4     self.color = "black"

NameError: name 'self' is not defined

생성자에서 해당 클래스가 다루는 데이터를 정의하는 경우도 많음



한줄씩 보며 이해하는 객체!

In [46]:
class Quadrangle:
    def __init__(self, width, height, color):
        self.width = width
        self.height = height
        self.color = color
In [47]:
square = Quadrangle()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-47-34362c3785a3> in <module>()
----> 1 square = Quadrangle()

TypeError: __init__() missing 3 required positional arguments: 'width', 'height', and 'color'
In [51]:
square = Quadrangle(5, 5, "black")
In [52]:
square.width
Out[52]:
5

소멸자: __del__(self)

  • method 이므로 첫 번째 인자는 self로 설정
  • 클래스 소멸시 호출
In [49]:
class Quadrangle:
    def __init__(self, width, height, color):
        self.width = width
        self.height = height
        self.color = color

    def __del__(self):
        print("Quadrangle object is deleted")        
square = Quadrangle(5, 5, "black")
Quadrangle object is deleted
  • 객체 삭제 문법
    • del 객체명


In [50]:
del square
Quadrangle object is deleted
초간단 연습3
* 정삼각형 클래스를 만들고, 정삼각형 이름하기
- attribute: 정삼각형 한 변의 길이, 삼각형 이름
- method: 정삼각형 이름 리턴
- 생성자에서 attribute 값 설정
- 소멸자작성 후, 객체 소멸시 object is deleted 출력
In [57]:
import math

class Figure:
    def __init__(self, length, name):
        self.length = length
        self.name = name

    def get_area(self):
        return (math.sqrt(3) / 2) * self.length**2  # (math.sqrt(3) / 2) * math.pow(self.length, 2) 도 가능함 

    def get_name(self):
        return self.name
    
    def __del__(self):
        print ('object is deleted')
        
square = Figure(10, 'dave')
print (square.get_area(), square.get_name())
object is deleted
86.60254037844386 dave
한발짝 더 나가보기!(심화 문제)
* 정삼각형 클래스를 만들고, 너비 출력하기
- attribute: 정삼각형 한 변의 길이, 삼각형 이름
- method: 정삼각형 너비 리턴
- 힌트: 정삼각형 한 변의 길이를 self.length 라고 할 때, 다음 식은 (math.sqrt(3) / 2) * self.length**2 와 같이 작성 가능 (import math 선언 후) $$ \frac{\sqrt{3}}{2} * 정삼각형 한변의 길이^2 $$
In [22]:
# 한발짝 더 나가보기!(심화 문제)
# 정삼각형 클래스를 만들고, 너비 출력하기
import math

class Quadrangle:
    def __init__(self, length):
        self.length = length

    def get_area(self):
        return (math.sqrt(3) / 2) * self.length**2  # (math.sqrt(3) / 2) * math.pow(self.length, 2) 도 가능함 

square = Quadrangle(10)
square.get_area()
Out[22]:
86.60254037844386
In [ ]: