ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • self,클래브변수,인스턴스변수
    Python 2022. 6. 9. 13:40

    먼저, 클래스를 선언해보자.

    #클래스 선언
    # class 클래스명: 클래스명은 첫글자 대문자
        # 함수
    class UserInfo: #객체생성
        # pass#일단 에러 안나게 하는거
        #속성,메소드
        def __init__(self,name,height,weight,address):#클래스를 선언한 후 초기화하는 init메소드임
            self.name = name
            self.height = height
            self.weight = weight
            self.address = address
        def user_info_p(self):
            print("info : ",self.name,self.height,self.weight,self.address)
    
    user1 = UserInfo("Kim",180,70,"인천") #인스턴스를 만듬 얘는 네임스페이스라고 부름
    user1.user_info_p() #인스턴스 만든 뒤 메소드실행
    print(id(user1)) #user1의 id가 나옴
    print(user1.__dict__) #네임스페이스가 출력됨

    위처럼 class 클래스명: 으로 선언하며 안에는 메소드나 속성들을 넣어준다.

    처음엔, __init__메소드를 넣어서 초기화해준다. 그리곤, 속성들을 넣어주고, self.name = name이렇게 self라는 객체 자기를 참조하는 매개변수 이용해준다. 

    그리곤, user1 = 클래스명()으로 인스턴스를 만들어주고, 클래스내에 있던 메소드를 실행해준다.

    그리고 id()를 이용하면 각각의 인스턴스의  id를 보여주고, user1이란 인스턴스에 .__dict__를 써주면 각각 인스턴스가 할당된 네임스페이스라는 공간을 보여준다.

     

    self에 대해 자세히 알아보자.

    class SelfTest:
        def function1(): #클래스메소드
            print("function1 called!")
        def function2(self): #인스턴스메소드
            print("function2 called!")
    
    self_test = SelfTest()
    self_test.function1() 
    #실행안됨 이유는 self를 안써서 누구의 function1함수인지 모르는 것이다. 즉 클래스 메소드가 된다.
    #그래서 SelfTest.function1하면 실행이 됨
    
    #인스턴스메소드를 실행하는건
    self_test.function2()
    #또는
    SelfTest.function2(self_test) 
    #이렇게 클래스메소드처럼 쓰고 파라미터에 self_test라는 인스턴스를 넣어줘야함

    즉, self를 써서 인스턴스를 생성했을 때,  누구의 것인지 알 수 있게 해준다. 

    self를 쓰면 인스턴스변수, self를 안쓰면 내부함수가 누구건지 모르기에 클래스에서 다같이 쓰는 클래스변수가 된다.

     

    클래스변수와 인스턴스변수를 예를 들어 알아보면,

    class WareHouse:
        #클래스 변수
        stock_num = 0 
        def __init__(self,name):
            self.name = name
            WareHouse.stock_num += 1 #stock_num은 self가 없어 클래스 변수기에 클래스인 WareHouse에 붙여씀 
        def __del__(self):
            WareHouse.stock_num -= 1
    
    
    user1 = WareHouse('kim')
    user2 = WareHouse('park')
    
    print(WareHouse.__dict__) 
    #이러면 stock_num이 2가 됨 왜냐?클래스 네임스페이스에 stock_num은 클래스변수라 공유하기 때문
    print(user1.stock_num) 
    #이렇게 해도 출력됨 클래스변수라 user1네임스페이스에 없으면 자동으로 클래스에서 찾기 때문
    
    del user2
    #하면 stock_num이 1로 줄어듬

     

    'Python' 카테고리의 다른 글

    모듈, 패키지  (0) 2022.06.10
    상속, 다중상속  (0) 2022.06.10
    함수 및 람다  (0) 2022.06.07
    반복문  (0) 2022.05.23
    조건문  (0) 2022.05.23

    댓글

Designed by Tistory.