본문 바로가기
Algorithm/자료구조, 알고리즘

[코딩 + 알고리즘 완주반] 6일차. self, 클래스 변수, 인스턴스 변수

by newnu 2021. 3. 20.
반응형

# 클래스 선언 및 self의 이해

클래스 선언

클래스 네임스페이스 self

클래스, 인스턴스 변수

self

# 클래스, 인스턴스 차이 중요
# 네임스페이스 : 객체를 인스턴스화할 때 저장된 공간
# 클래스 변수 : 직접 사용 가능, 객체보다 먼저 생성
# 인스턴스 변수 : 객체마다 별도로 존재, 인스턴스 생성 후 사용

# 클래스 선언
# class 클래스명:
#     함수
#     함수
#     함수


# 속성 : 이름, 키, ...
# 메소드 : 동작

# 예제1
class UserInfo:
    def __init__(self,name):
        self.name = name
    def user_info_p(self):
        print("Name : ",self.name)

# 네임스페이스    
user1 = UserInfo("Kim") # 인스턴스 생성
print(user1.name) # Kim
user1.user_info_p() # Name :  Kim
user2 = UserInfo("Park")
print(user2.name) # Park
user2.user_info_p() # Name :  Park

print(id(user1)) # 140480848385360
print(id(user2)) # 140480848385488
print(user1.__dict__) # {'name': 'Kim'}
print(user2.__dict__) # {'name': 'Park'}

# 예제2
# self의 이해
class SelfTest:
    def function1(): # 클래스 메소드 ( self 인자가 없기 때문에 인스턴스에서 호출 못함)
        print('function1 called!')
    def function2(self): # 인스턴스 메소드
        print('function2 called!')

self_test = SelfTest() # 인스턴스 생성
# self_test.function1()
SelfTest.function1() # function1 called!
self_test.function2() # function2 called!

print(id(self_test)) # 140480848385616
SelfTest.function2(self_test) # function2 called!

# 예제 3
#클래스 변수, 인스턴스 변수(self 필요)

class WareHouse:
    stock_num =0 # 클래스 변수 - 모두가 공유
    def __init__(self,name): #초기회할 떄
        self.name = name # 인스턴스 변수
        WareHouse.stock_num+=1
    def __del__(self): # 인스턴스가 종료될 때 실행 
        WareHouse.stock_num-=1

user1 = WareHouse('Kim')
user2 = WareHouse('Park')
user3 = WareHouse('Lee')

print(user1.__dict__) # {'name': 'Kim'}
print(user2.__dict__) # {'name': 'Park'}
print(user3.__dict__) # {'name': 'Lee'}
print(WareHouse.__dict__) # 클래스 네임스페이스, 클래스 변수 (공유)
#{'__module__': '__main__', 'stock_num': 3, '__init__': <function WareHouse.__init__ at 0x7fc43f1177a0>, '__del__': <function WareHouse.__del__ at 0x7fc43f117830>, '__dict__': <attribute '__dict__' of 'WareHouse' objects>, '__weakref__': <attribute '__weakref__' of 'WareHouse' objects>, '__doc__': None}

print(user1.name) # Kim
print(user2.name) # Park 
print(user3.name) # Lee


print(user1.stock_num) # 3 # 자기 네임스페이스에 없으면 클래스 네임 스페이스에서 찾고 거기에도 없으면 에러
print(user2.stock_num) # 3
print(user3.stock_num) # 3

del user1

print(user2.stock_num) # 2 # user 1 지울 때 del 
print(user3.stock_num) # 2
반응형