클래스와 인스턴스

 

 

 

 

# 파이썬 클래스
# OOP(객체 지향 프로그래밍), Self, 인스턴스 메소드, 인스턴스 변수

# 클래스 and 인스턴스 차이 이해
네임스페이스 : 객체를 인스턴스화 할 때 저장된 공간
클래스 변수(속성) 직접 접근 가능, 공유
인스턴스 변수(속성) : 객체마다 별도 존재

 

 


##클래스 개념

oop란?(객체지향프로그램) : 생산성상향,재사용 극대화,유지보수,악영향 최소화,경제적
클래스(붕어빵 틀),인스턴스,
self개념
인스턴스 메소드
클래스,인스턴스 변수


 

 



# 예제1

class Dog: # Dog(object),Dog()라고 해도 된다. 모든 class는 object 상속받기 때문에 우리가 편한대로
           # 하면 된다.
           
    # 클래스 속성(변수)
    species = 'firstdog'

    # 초기화(__init__)/인스턴스(객체) 속성(변수)
    # 모든 클래스는 초기화 메소드를 갖는다.
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

 

# __init__(생성자)

클래스로부터 인스턴스가 생성될 때 자동으로 실행되도록 약속되어 있는 메소드를 우리가 생성자라고 한다.

 

그말은, 인스턴스가 생성될 때 꼭 처리해야 되는 어떤 작업들을 __init__메소드의 내용으로 넣으면 실행된다는 것이다.

다시말해서 초기화를 할 수가 있는 것이다.

 

마치 우리가 컴퓨터를 처음 키면 부팅이라는 초기화를 하는 것처럼

자동차를 사용하러면 시동이라는 초기화를 하는 것처럼

 

우리는 객체를 만들 때 초기화 해야 되는 어떤 작업들을 __init__라고 하는 약속되어 있는 메소드의 본문에

넣어두는 것이다.

 

 

 

 

 


# 클래스 정보

print(Dog) #<class '__main__.Dog'>

 

 

 



# 인스턴스화

# 클래스를 가지고서 변수를 할당해서 메모리에 올라가고 id값을 갖는 
# 실제로 설계도를 바탕으로 구현된 것을 인스턴스화 되었다고 한다.

# 사물인 보이는 것들 우리가 구현할 대상을 객체라고 한다.

a = Dog("mikky", 2)
b = Dog("baby", 3)
c = Dog("mikky", 2)


# 비교

print(a == b, id(a), id(b), id(c)) #False 1365738360784 1365738360688 1365738355056

#a,c는 값이 똑같지만 파이썬 코드 입장에서는 전혀 다른 객체로 간주하고 있다.
#인스턴스화 시킨 것들은 모두 다르다고 생각하면 된다.

 

 

 

 





네임스페이스(객체를 인스턴스화 할 때 저장된 공간/ 딕셔너리 형태)

print('dog1', a.__dict__) #dog1 {'name': 'mikky', 'age': 2}

print('dog2', b.__dict__) #dog2 {'name': 'baby', 'age': 3}

 

 

 

 



# 인스턴스 속성 확인

print('{} is {} and {} is {}'.format(a.name, a.age, b.name, b.age))

#mikky is 2 and baby is 3

 

 

 

 

 



# 클래스 속성 확인

if a.species == 'firstdog':
    print('{0} is a {1}'.format(a.name, a.species))
 
#mikky is a firstdog

print(Dog.species) #firstdog 클래스로 직접접근 가능
print(a.species) #firstdog 인스턴스로도 직접접근 가능
print(b.species) #firstdog

 

 

 

 

 



# 예제2

# self의 이해

class SelfTest:
    def func1(): #self가 없다는 것은 클래스 메소드라는 것이다.
        print('Func1 called')
        
    def func2(self): #self가 붙은 것은 인스턴스 메소드이다.
    
#self는 클래스 내부의 매개변수/ func2는 독립적인 공간에 있는 속성값에 접근하기 때문에
#공통메소드로써 사용할 수 있다.

        print(id(self))
        print('Func2 called')
        
# 클래스 안에 __init__매소드가 없으면 파이썬이 내부적으로 알아서 실행해준다.
# self라는 매개변수가 있으면 인스턴스화 시킨 변수가 self로 넘어간다.


f = SelfTest() 


print(dir(f)) func1과 func2가 있다.
print(id(f)) #1365738354672

# f.func1() # 예외(에러)  매개변수가 없다.
f.func2() #1365738354672
          #Func2 called
# self는 인스턴스를 요구한다. self에 f가 넘어간 것이다. f와 self의 아이디 값이 같다.

SelfTest.func1() #Func1 called     self가 필요없이 클래스로 바로 접근해 호출할 수 있는 메소드
# SelfTest.func2() # 예외 인스턴스를 요구하지만 들어가지 않았기 때문에 에러
SelfTest.func2(f) #1365738354672 인스턴스를 넘겨주면 값이 나온다.
                  #Func2 called

 

<설명보충>

 

 

TIL#34 클래스 self

TIL#25 클래스 와 인스턴스(중요) 클래스와 인스턴스 # 파이썬 클래스 # OOP(객체 지향 프로그래밍), Self, 인스턴스 메소드, 인스턴스 변수 # 클래스 and 인스턴스 차이 이해 # 네임스페이

higher77.tistory.com

 

 

 



# 예제3
# 클래스 변수(공유), 인스턴스 변수(개별)

 

class Warehouse:
    # 클래스 변수
    stock_num = 0 # 재고

    def __init__(self, name): #생성자
        # 인스턴스 변수
        self.name = name
        Warehouse.stock_num += 1

    def __del__(self): #소멸자 del메소드는 객체가 소멸할 때 자동으로 호출되는 함수다.
        Warehouse.stock_num -= 1

user1 = Warehouse('Lee')
user2 = Warehouse('Cho')

print(Warehouse.stock_num) #2

print(user1.name) #Lee
print(user2.name) #Cho
print(user1.__dict__) #{'name': 'Lee'}
print(user2.__dict__) #{'name': 'Cho'}
print('before', Warehouse.__dict__) #before ···'stock_num': 2,···
print('>>>', user1.stock_num) #>>> 2

#Warehouse.__dict__에서는 stock_num이 2라고 나오는데 user1,2.__dict__에는 나오지 않지만
#user1.stock_num라고 치면 Warehouse클래스의 네임스페이스에 가서 알아서 찾아온다.
#어처피 모두 공유하기 때문에 user1,2.__dict__에 굳이 표시를 안해준 것이다.

del user1
print('after', Warehouse.__dict__) #after ···'stock_num': 1,···


 

 

 

 


# 예제4

class Dog2: # object 상속
    # 클래스 속성
    species = 'firstdog'

    # 초기화/인스턴스 속성
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        return '{} is {} years old'.format(self.name, self.age)

    def speak(self, sound):
        return "{} says {}!".format(self.name, sound)


# 인스턴스 생성
c = Dog2('july', 4)
d = Dog2('Marry', 10)
# 메소드 호출
print(c.info())
print(d.info())
# 메소드 호출
print(c.speak('Wal Wal'))
print(d.speak('Mung Mung'))

 

 

 

 

 

'Python > Today I learned' 카테고리의 다른 글

TIL#27 패키지와 import  (0) 2021.05.18
TIL#26 모듈과 import, sys.path  (0) 2021.05.18
TIL#24 input 사용법  (0) 2021.05.18
TIL#23 함수식 및 람다(lambda)  (0) 2021.05.15
TIL#22 제어문 - 반복문(While문)  (0) 2021.05.15

+ Recent posts