글을 시작하며..

학교에서 전공 수업도 듣고 파이썬으로 프로젝트, 회사에서 일도 하면서 파이썬을 다 안다고 생각하던 나 자신이 창피해지는 일주일...

AI Tech를 진행하면서 정말 짧은 시간안에 Python을 이렇게 제대로 공부하는 건 너무 좋은 거 같다.


  • Obeject-Oriented Programming, OOP
  • 객체 : 실생활에서 일종의 물건. 속성(Attribute)와 행동(Action)을 가짐
  • OOP는 이러한 객체 개념을 프로그램으로 표현. 속성은 변수(variable), 행동은 함수(method)로 표현됨
  • 파이썬 역시 객체 지향 프로그램 언어

class 선언하기

  • class 선언, object는 python3에서 자동 상속
class SoccerPlayer(object):
#object는 python3에서는 자동 상속
class SoccerPlayer():

 

python naming rule

  • 변수와 Class명 함수명은 짓는 방식이 존재
  • snake_case : 띄어쓰기 부분에 "_"를 추가. 뱀처럼 늘여쓰기, 파이썬 함수, 변수명에 사용
  • CamelCase : 띄워쓰기 부분에 대문자. 낙타의 등 모양, 파이썬 Class명에 사용.

Attribute 추가는 __init__, self와 함께

__init__은 객체 초기화 예약함수

 

파이썬에서 __의미

  • __ 는 특수한 예약 함수나 변수 그리고 함수명 변경(맨글링)으로 사용
  • ex : __main__, __add__, __str__, __eq__
  • 참고사이트

method(Action)추가는 기존 함수와 같으나, 반드시 self를 추가애야만 class 함수로 인정됨.

클래스에서 self는 생성된 instance를 의미함.

 

class SoccerPlyer():
	def __init__(self, name:str, postion: str, back_number:int):
		self.name = name
		self.position = position
		self.back_number = back_number

	def change_back_number(self, new_number):
		print("선수의 등번호를 변경합니다. : From {} to {}".format(self.back_number, new_number))
		self.back_number = new_number

# Object 이름 선언과 함께 초기값 입력하기
park = SoccerPlayer("park", "MF", 10)
# 객체명 = Class명(__init__함수 Interface, 초기값)

 

OOP에 필요한 것 : Inheritance(상속), Polymorphism(다형성), Visibility(가시성)

상속(Ingeritance)

  • 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성 하는 것.
class Person(object):
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
class Korean(Person):
	pass

first_korean = Korean("Sungchul", 35)
print(first_korean.name)

class Person(object): # 부모 클래스 Person 선언
	def __init__(self, name, age, gender):
		self.name = name
		self.age = age
		self.gender = gender
	def about_me(self): # Method 선언
		print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살
		입니다.")

class Employee(Person): # 부모 클래스 Person으로 부터 상속
	def __init__(self, name, age, gender, salary, hire_date):
		super().__init__(name, age, gender) # 부모객체 사용
		self.salary = salary
		self.hire_date = hire_date # 속성값 추가

	def do_work(self): # 새로운 메서드 추가
		print("열심히 일을 합니다.")

	def about_me(self): # 부모 클래스 함수 재정의
		super().about_me() # 부모 클래스 함수 사용
		print("제 급여는 ", self.salary, "원 이구요, 제 입사일은 ", self.hire_date, 
		" 입니다.")

다형성(Polymorphism)

  • 같은 이름 메소드의 내부 로직을 다르게 작성
  • Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함.
  • 중요한 OOP의 개념 그러나 너무 깊이 알 필요 X

가시성(Visibility)

  • 객체의 정보를 볼 수 있는 레벨을 조절하는 것
  • 누구나 객체 안에 모든 변수를 볼 필요가 없음
    1. 객체를 사용하는 사용자가 임의로 정보 수정
    2. 필요 없는 정보에는 접근 할 필요가 없음
    3. 만약 제품으로 판매한다면? 소스의 보호

Encapsulation

  • 캡슐화 또는 정보 은닉(Information Hiding)
  • Class를 설계할 때, 클래스 간 간섭/정보공유의 최소화
  • 캡슐을 던지듯, 인터페이스만 알아서 써야함

self.__items : 앞에 __가 붙으면 Private 변수로 선언하여 타객체가 접근못하게 만듬.

접근허용을 해서 사용 할 수 있게도 함.

class Product(object):
	pass

class Inventory(object):
	def __init__(self):
		self.__items = []
	def add_new_item(self, product):
		if type(product) == Product:
			self.__items.append(product)
			print("new item added")
		else:
			raise ValueError("Invalid Item")
	def get_number_of_items(self):
		return len(self.__items)

@property
def items(self):
	return self.__items

my_inventory = Inventory()
my_inventory.add_new_item(Product())
print(my_inventory.__items) # error
print(my_inventory.items)

decorate

first-class objects

  • 일등함수 또는 일급 객체
  • 변수나 데이터 구조에 할당이 가능한 객체
  • 파라메터로 전달이 가능 + 리턴 값으로 사용
  • 파이썬의 함수는 일급함수

Inner function

  • 함수 내에 또 다른 함수가 존재
  • 흔하며 많이 나옴
  • closures : inner function을 return값으로 반환(자바스크립트에서 많이 나오는 개념)

decorator function

  • 복잡한 클로져 함수를 간단하게
def star(func):
	def inner(*args, **kwargs):
		print("*" * 30)
		func(*args, **kwargs)
		print("*" * 30)
		return inner

@star
def printer(msg):
	print(msg)
printer("Hello")

# star(func)에서 func에 printer가 들어가고
# printer(msg)에서 msg에 Hello가 들어가는 형태 

def test1(num1):
    def test2(num2):
        def inner(*args):
            result = num2(*args) * 10
            return [num1, result]
        return inner
    return test2

@test1(2)
def chk(n):
    return n ** 2

print(chk(3)) # [2, 90]

# test1의 num1에 2
# test2의 num2에 chk(3)
# inner의 *args에 chk의 파라미터인 n
# result = num2(*args) * 10 -> chk(3) * 10 -> 9 * 10 -> 90
# return = [2,90]

 

+ Recent posts