ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3월 22일 TIL- 클래스 객체 생성 및 __init__매소드
    TIL(Today I Learned) 2023. 3. 22. 21:33

    Q : 밑의 클래스를 정의했다고 가정하고 이 클래스를 통하여 객체를 생성하고, 너비와 높이를 5와 10으로 설정, 넓이와 둘레를 출력하는 코드를 작성해보세요

    class Rectangle:
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def area(self):
            return self.width * self.height
    
        def around(self):
            return 2 * (self.width + self.height)

     

    먼저 객체 생성을 해보기 시작했다. 하지만 여기서 이런식으로 제대로 객체를 생성하기 전에 매소드를 호출하려고 하니 제대로 작동하지 않았다.

    r1 = __init__()

     

    매소드가 사용되지 않은 이유는 이 매소드를 찾을 수 없었다고 한다. 그럴 수 밖에 없었다. r1은 클래스의 객체가 아니었으니까. 그럼 이제 제대로 r1을 객체로 만들어주자.

    r1 = Rectangle()

    그 후 너비와 높이의 매개변수에 5와 10을 대입해 주었다.

    r1 = Rectangle()
    r1.__init__(5, 10)

    그런데 실행이 안된다 왜일까? 에러문구를 읽어보니, TypeError: __init__() missing 2 required positional arguments: 'width' and 'height'

    이라고 뜬다. 너비와 높이값을 지정 해줘야하는 걸까?

    r1 = Rectangle()
    r1.__init__(width=5, height=10)

    여전히 같은 문구가 뜬다. 왜일까... 원하는 대로 숫자를 줬는데 왜 안되는걸까,, 뭘까.. 

    마음을 다 잡고 어디가 비었을까 생각해보면서 다시 코드를 작성해보았다.

    class Rectangle:
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def area(self):
            return self.width * self.height
    
        def around(self):
            return 2 * (self.width + self.height)
    
    
    r1 = Rectangle()

    그러던중 Rectangle에 커서를 올리니 설명이 등장했다. (class)Rectangle(width: int, height: int)!!!!!!!! 여기에 들어갔어야 할 인수를 엉뚱한데다 넣고 있었던 것이었다. 그러니 비었다고, 없다고 오류가 났을 수 밖에... 그 다음은 아주 편안하게 코드를 작성했다.

    class Rectangle:
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def area(self):
            return self.width * self.height
    
        def around(self):
            return 2 * (self.width + self.height)
    
    
    r1 = Rectangle(5, 10)
    print(r1.area()) #50
    print(r1.around()) #30

    금방 넓이와 둘레를 간단하게 구할 수 있었다. 이 간단한 걸 그렇게 오랫동안 붙잡고 있었다니, 슬프다. class에 __init__메소드를 사용할 경우 인스턴스 생성 시 해당 메소드가 실행된다는 사실을 이 문제를 통해 알게 되었다. 그러니 class에 바로 인수를 넣었던 것이다. 오늘부터 __init__은 절대 잊지 못할 것 같다. 다음부터는 헷갈리는 일 없이 오류도 잘 보고 설명도 잘 읽어봐야겠다!

    댓글

Designed by Tistory.