
클래스와 인스턴스
# 파이썬 클래스
# 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 |