240717 TIL #453 Python OOP

김춘복·2024년 7월 17일
0

TIL : Today I Learned

목록 보기
453/494

Today I Learned

오늘은 파이썬에서의 OOP, 객체지향에 대해서 공부했다.


OOP

파이썬도 java와 같은 객체지향 언어이다.
속성과 행위를 가진 class를 선언해서 사용할 수 있다.

Class

  • 구현 방법
    class 키워드를 통해 선언한다.
class MyDog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def bark(self):
        print(f"{self.name}가 짖는중입니다.")
  • 파이썬에서 클래스 명은 앞글자가 대문자인 CamelCase로 표기한다.

  • attribute는 __init__ 초기화 함수에서 선언한다.

  • self 키워드는 현재 객체를 나타내는 매개변수다.
    클래스의 메서드를 정의할 때 self를 첫번째 매개변수로 사용하는 것이 관례다.

  • instance 사용 방법

my_dog = Dog("멍멍이", 3)
print(my_dog.name)  # 멍멍이
print(my_dog.age)   # 3
my_dog.bark()       # 멍멍이가 짖는중입니다.

상속

  • 부모 클래스로 부터 속성과 메서드를 자식클래스가 상속받을 수 있다.
    class 자식클래스(부모클래스):로 상속이 가능하다.
    3버전 이상에서는 (object)를 생략 가능하다.
class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def bark(self):
        print("멍멍!")

class Cat(Animal):
    def meow(self):
        print("야옹~")

다형성

같은 이름의 메서드 또는 함수가 서로 다른 클래스에서 다른 동작을 수행할 수 있는 능력으로 주로 오버라이딩으로 파이썬에서는 구현된다.

캡슐화

정보 은닉을 통해 객체의 내부 상태를 보호하는 것

  • 주로 속성 이름 앞에 _(언더바)를 써서 표기하는 것이 관례지만 완벽히 보호되진 않는다.

  • 그래서 getter와 setter를 생성해서 접근 혹은 수정을 한다.

  • @property 데코레이터를 이용해서 명시적으로 getter를 만들고, 이를 활용해서 setter를 만드는 방법이 있다.

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    @property
    def name(self):
        return self._name
    
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, value):
        if value > 0:
            self._age = value
        else:
            print("나이는 0보다 커야 합니다.")

# 객체 생성
person = Person("Alice", 30)

# @property를 통한 속성 접근
print(person.name)  # 출력: Alice
print(person.age)   # 출력: 30

# @property 및 setter를 통한 속성 변경
person.name = "Bob"  # AttributeError: can't set attribute
person.age = 25
print(person.name)  # 출력: Alice
print(person.age)   # 출력: 25

일등함수(일급객체)

  • 변수나 데이터 구조에 할당이 가능한 객체

  • 파라미터로 전달이 가능하고 리턴값으로 사용할 수 있다.

  • 파이썬에서는 함수를 first-class objects로 취급한다.

  • 즉, 함수를 변수에 할당하고, 함수의 인자로 전달할 수 있다는 의미다.

def greet(name):
    return f"안녕하세요, {name}님!"

# 함수를 변수에 할당
my_greet_function = greet

# 함수를 다른 함수의 인자로 전달
def call_greet_function(func, name):
    return func(name)

print(call_greet_function(my_greet_function, "Kim"))  # 출력: 안녕하세요, Kim님!

데코레이터(@)

파이썬에서 함수를 수정하거나 확장하기 위해 사용되는 문법
다른 함수를 가져와서 그 함수의 동작을 수정하거나 래핑할 수 있다.

  • @를 활용한다.

  • 함수를 입력받아 함수를 반환한다.

  • 데코레이터 사용전 예시

# decorator
def say_hi():
    print("hi")

def say_bye(func):
    func()
    print("bye")

say_bye(say_hi) # 출력: hi bye
  • 데코레이터 사용 예시
    적용하고자 하는 함수 위에 @함수명을 적으면 된다.
# decorator
def say_bye(func):
  def print_func():
      func()
      print("bye")
  return print_func

@say_bye
def say_hi():
    print("hi")

say_hi() # 출력: hi bye
  • 데코레이터로 파라미터를 함께 전달하는 예시
def answer(func):
    def inner_answer(*args, **kwargs):
        print(f"{func.__name__} start!")
        print("in progress..")
        print(f"result is {func(*args, **kwargs)}")
    return inner_answer

@answer
def add(a, b):
    return a+b

add(3,4)
""" 출력:
add start!
in progress..
result is 7
"""
profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글