728x90

아나콘다 데이터 분석 프레임워크 설치하고, 주피터 노트북에서 필요한 라이브러리 다운로드하고(맥이랑 윈도 둘 다)

오늘 배운 내용을 정리해보려고 합니다. 지금 시간은 2024-02-17

 

 


class Rectangle:
    count = 0 #클래스변수
    
    def __init__(self, width, height):
        self.width = width
        self.__width = width
        self.height = height
        Rectangle.count += 1
        
    #instance method, 주로 쓰는 메서드
    def calcArea(self):
        area = self.width * self.height
        return area
    
    def calcArea02(self):
        area = self.__width * self.height
        return area
    
    #static method
    @staticmethod
    def isSquare(rectWidth, rectHeight):
        return rectWidth ==  rectHeight
    
    #class method
    @classmethod
    def printCount(cls):
        print(cls.count)
        
        
        
#테스트
square = Rectangle.isSquare(5, 5)
print(square)

rect = Rectangle(10, 20)
print(rect)
print(rect.calcArea02())


# 인스턴스 변수 엑세스
rect.width = 10
print("width = ", rect.width)

# 인스턴스 변수 엑세스
rect.__width = 10
print("width = ", rect.__width)



print(rect.count)
print(Rectangle.count)

#클래스변수 인스턴스변수 변화보기
rect.count = 20
print(rect.count)
print(Rectangle.count)
 

 

 

파이썬에서 특히 클래스 변수를 액세스 할 때, "클래스명. 클래스변수명" 혹은 "객체명. 클래스변수명"을 둘 다 허용하기 때문에 약간의 혼란을 초래할 수 있다. 예를 들어, 위의 예제에서 Rectangle.count 혹은 r.count은 모두 클래스 변수 count를 액세스 하는 경우로서 이 케이스에는 동일한 값을 출력한다.

하지만, 아래 예제와 같이 Rectangle 클래스의 클래스 변수 count를 Rectangle.count로 할당하지 않고 객체 r로부터 할당하면 혼돈스러운 결과를 초래하게 된다.

파이썬에서 한 객체의 attribute에 값이 할당되면 (예를 들어, r.count = 10), 먼저 해당 객체에 이미 동일한 attribute가 있는지 체크해서 있으면 새 값으로 치환하고, 만약 그 attribute가 없으면 객체에 새로운 attribute를 생성하고 값을 할당한다. 즉, r.count = 10의 경우 클래스 변수인 count를 사용하는 것이 아니라 새로 그 객체에 추가된 인스턴스 변수를 사용하게 되므로 클래스 변숫값은 변경되지 않는다. 

파이썬에서 한 객체의 attribute를 읽을 경우에는 먼저 그 객체에서 attribute를 찾아보고, 없으면 그 객체의 소속 클래스에서 찾고, 다시없으며 상위 Base 클래스에서 찾고, 그래도 없으면 에러를 발생시킨다. 따라서, 위 예제에서 클래스 변숫값이 출력된 이유는 값을 할당하지 않고 읽기만 했기 때문에, r 객체에 새 인스턴스 변수를 생성하지 않게 되었고, 따라서 객체의 attribute가 없어서 클래스의 attribute를 찾았기 때문이다. 이러한 혼돈을 피하기 위해 클래스 변수를 엑세스할 때는 클래스명을 사용하는 것이 좋다. 

(출처: 예제로 배우는 파이썬 프로그래밍)

+ Recent posts