-
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로 줄어듬