정리/Data&AI

Python에서 OOP하기

yunny_world 2022. 9. 14. 15:42

python class

- OOP
- The result of the class implementation is called an instance

 

파이썬의 OOP 기본 개념

class Hello: # class 생성
	def greeting(self): # method 생성
		print('Hello, World!')

a = Hello() # instance 생성

a.greeting() # method 호출


class에는 크게 attribute과 method 두 가지가 있다.
attribute는 매개변수를 받고 사용하기 위한 값, method는 만들어진 attribute를 이용해 어떤 행위를 하는 함수라고 생각해도 된다.

class Member:
	value = [] # class attribute

	def info(self, name, age, address): # method
		self.name = name # instance attribute
		self.age = age
		self.address = address
		print('저의 이름은 {0}이고, 나이는 {1}, 사는 곳은 {2} 입니다'.format(self.name, self.age, self.address))
 		Member.value.append(age)
        
	def info2(self, name, age, address):
 		self.name = name
		self.age = age
 		self.address = address
		print('저의 이름은 {0}이고, 나이는 {1}, 사는 곳은 {2} 입니다'.format(self.name, self.age, self.address))
 		Member.value.append(age)
        
 introduce = Member()
 
 introduce.info('nirsa', 80, '인천광역시')

 

instance attribute과 class attribute 구분하기

instance attribute은 instance별로 각자 다른 값을 지니게 되고, self.attribute를 사용한다.
이때, self는 instance 자기 자신을 가르킨다.

class attribute은 모든 instance에서 공유할 수 있고, class명.attribute을 사용한다.

Reference:
https://nirsa.tistory.com/110

 

Python의 special method

special method는
- 특정 상황에서 자동으로 호출되는 method(이름이 약속되어 있는 method)들을 일컫는 말이다.
- __XX__() 형태로 앞에 언더바 2개, 뒤에 언더바 2개 형태를 가진다.
- python 표준 타입과 유사하게 동작하는 class를 설계하기 위해서 반드시 필요하다
- 약 100여개가 존재한다.

__init__()은 객체가 생성될 때에 호출된다.
__del__()은 객체가 파괴될 때에 호출된다.

Reference:
https://kukuta.tistory.com/334
https://www.pythonlikeyoumeanit.com/Module4_OOP/Special_Methods.html

 

__init__, __str__, __repr__에 대해서

__init__ :
initialize
객체를 만들 때 처음 실행되는 초기화 메소드이다. 전달받는 인자가 self외에 다른 것이 있다면, 객체를 생성할 때 인자값으로 넘겨주면 __init__ 메서드에서 사용한다.

__str__ :
string
객체 자체를 출력 할 때 넘겨주는 형식을 지정해주는 메소드이다.

__repr__ :
representation
사용자가 객체 자체를 이해할 수 있게 표현해주는 메소드이다.
아래 코드를 보면 __str__과 __repr__의 명시적인 차이를 볼 수 있다.

만약 __str__이나 __repr__를 사용하지 않고, 출력한다면, 해당 객체의 메모리 주소가 출력된다.

class Test():
	def __init__(self, num1 = None, num2 = None):
		if num1 == None: self.num1 = 'X'
		if num2 == None: 
 			self.num2 = 'X'
			return 
 		self.num1 = num1
		self.num2 = num2

	def __str__(self):
		if self.num1 == 'X' or self.num2 == 'X':
			return '전달받은 인자가 없습니다.'
		else:
			return f'print method : num1 + num2 = {self.num1 + self.num2}.'

	def __repr__(self):
		if self.num1 == 'X' or self.num2 == 'X':
			return "전달받은 인자가 없습니다."
 		else:
			return f'interpreter : num1 + num2 = {self.num1 + self.num2}.'


Reference:
https://it-neicebee.tistory.com/104

 

Pyhton의 self

- Python method의 첫 번째 인자로 항상 자동으로 instance가 전달된다.
- class 내에 정의된 self는 instance이다.

class Foo:
	def func1():
		print("function 1")

	def func2(self):
		print(id(self))
		print("function 2")
               
f = Foo()
 
print(id(f))
f.func2()
# 둘의 출력 값이 같으므로, class 내에 정의된 self는 instance이다.

Foo.func1() # function 1
f.func1() # ERROR


f.func1()가 에러를 내는 이유는, 메소드가 아무런 인자를 받지 않아야 하는데, class.method() 는 첫 번째 인자로 항상 자동으로 instance가 전달되기 때문이다.
반면, instance.method() 는 올바르게 아무런 인자를 받지 않아서, 제대로 작동한다.

따라서, self는 객체의 instance 그 자체를 말한다. 즉, 객체 자기 자신을 참조하는 매개 변수인 셈이다. 객체 지향 언어는 모두 이걸 메소드에 안보이게 전달하지만, Python은 class의 method를 정의할 때 self를 명시하고, method를 불러올 때 self를 자동으로 전달한다. 또, self를 사용함으로써 class 내에 정의한 멤버에 접근할 수 있게된다.

Reference:
https://velog.io/@magnoliarfsit/RePython-1.-self-이해하기


Python의 super()

python은 class간 상속이 가능하다.

class A:
	def __init__(self):
		print('A')

	def hello(self):
		print('hello')

class B(A): # B의 class를 선언할 때, A를 전달해주면, B(자식)는 A(부모)를 상속받게 된다.
	def __init__(self):
		print('B')

	def hi(self):
		print('hi')
        
b = B()
b.hello() # 상속을 받게 되면, B는 A의 속성, 메소드들을 할용할 수 있다.


super()는 이런 상속 관계에서 상속의 대상인 부모 클래스를 호출하는 함수이다.
super()의 인자로는 자식 클래스 이름, 자식 클래스의 객체가 필요하다.
class 선언 내부에서 super를 호출하면, 인자 전달을 따로 하지 않아도 자동으로 해당 클래스의 부모 클래스를 호출해준다.

class A:
	def __init__(self):
		print('A')

	def hello(self):
		print('hello')

class B(A):
	def __init__(self):
		super().__init__()
		print('B')

	def hi(self):
		print('hi')
        
b = B() # A (new line) B
super(B, b).__init__() # A


Reference:
https://harry24k.github.io/super/

'정리 > Data&AI' 카테고리의 다른 글

활성화 함수와 손실 함수  (0) 2022.10.20
Batch와 Epoch  (0) 2022.10.13
Overfitting, Hyperparameters  (0) 2022.10.04
손실 함수, 경사 하강법, 역전파  (0) 2022.09.22
Jupyter Notebook관련 이것 저것  (0) 2022.09.14