티스토리 뷰

[1] 클래스의 특징

구분 예시
(1)상속 (Inheritance)
부모클래스로 부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것
class Person(object):  # 초기 상속은 object가 기준임
  def __init__(self, name, age, gender):
    self.name = name
    self.age = age
    self.gender = gender

class Korean(Person):
  def __init__(self, name, age, gender, salary, hire_date):
  # 속성 지정 안해도 부모클래스 Person로부터 상속받아 속성, 함수 사용 가능
    super().__init__(name, age, gender) # super는 부모꺼
    self.salary = salary #self는 내꺼
    self.hire_date = hire_date

(2) 다형성 (Polymorphism)
같은 이름 메소드(비슷한 역할)의 내부 로직을 다르게(다른 결과) 작성

  def talk(self): # 추상화방법, 
    raise NotImplementedError("Subclass must implement abstract method")
  
class Cat(Animal):
  def talk(self):
    return "Meow!"
    
class Dog(Animal):
  def talk(self):
    return "Woof! Woof!"  

animals = [Cat("야옹"), Cat("냐옹"), Dog("멍멍")]

for animal in animals:
  print(animal.name +':'+animal.talk()) 

# 출력결과
야옹:Meow!
냐옹:Meow!
멍멍:Woof! Woof!
(3) 가시성 (Visibility) 
* 캡슐화 또는 정보은닉이라고 함
- 클래스간 간섭/정보공유 최소화

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

-접근허용도 가능: @property
=> 함수명을 변수명처럼 사용가능
안에있는 정보를 복사해서 외부로 빼줌(원본은 수정되면 안되니까!)
class Product(object):
  pass

class Inventory(object):
  def __init__(self):
    self.__items = [] # __ : Private 변수로 선언, 다른 객체가 접근 못함
  # 외부에서 엉뚱한 값 넣거나 삭제하지 못하게
  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)
  
my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())

print(my_inventory.__items) # 캡슐화해서 에러남
(4) 데코레이터 @

1) 일등함수 또는 일급객체
- 변수나 데이터 구조에 할당 가능한 객체
- 파라미터로 전달이 가능+리턴 값으로 사용(ex. map의 파라미터로 함수사용)

2) Inner function (내재함수)
함수 내에 또 다른 함수가 존재
* closures: inner funtion을 return값으로 반환
**클로저는 자바스크립에서 많이씀
비슷한 목적을 가진 다양한 변형이 되어있는 함수들을 만들 수있음

3) decorator funtion
 복잡한 클로저 함수를 간단하게!
  @property # 함수명을 변수명처럼 사용하여 안에 있는 정보를 외부에 빼줌
  def items(self): 
    return self.__items # 보통은 원본수정 방지를 위해 복사본을 반환해줌
  
print(my_inventory.items)
# [<__main__.Product object at 0x000001A90156BB80>, <__main__.Product 
object at 0x000001A90156BB50>]

1) 파이썬의 함수는 일급함수 => return에 함수 반환 가능
  a. 변수에 함수 할당
def square(x):
  return x*x

f = square
print(f(5)) # 25

b. 파라미터에 함수 전달 -> 비슷한기능 변형가능한 함수 만들때 사용
def square(x):
  return x*x

def cube(x):
  return x*x*x


def formula(method, argument_list):
  return [method(i) for i in argument_list]

a= [1,2,3,4,5]
print(formula(square,a)) # [1, 4, 9, 16, 25]
print(formula(cube,a)) # [1, 8, 27, 64, 125]

2) 함수 내에 다른 함수 존재(흔한 구조임)
def print_msg(msg):
  def printer():
    print(msg)
  printer()

print_msg("Hello") # Hello

** closer : Inner function을 return 값으로 반환 (같은 용도인데 조금 다를때 사용)
def star(func): # func자리에 @star 해준 printer가 들어감
  def inner(*args, **kwargs): # *args = ("Hello","T")
    print(args[1]*30)
    func(*args, **kwargs) #  위에 inner의 arguments 전달받음
    print(args[1]*30)
  return inner

@star
def printer(msg, mark):
  print(msg)
  
printer("Hello","T")

#출력
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Hello
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

* 복합한 클로저
def generate_power(exponent): # exponenet = 2
  def wrapper(f): # f = raise_two()
    def inner(*args): # *args = 7
      result = f(*args) # raise_two(7) = 49
      return exponent**result # 2**49
    return inner
  return wrapper

@generate_power(2) # 데코레이터에도 arguments 넣을 수 있음
def raise_two(n):
  return n**2 # 7**2 =49

print(raise_two(7)) # 562949953421312

 

 

 

※ 출처 : 네이버 부스트코스 - 인공지능 기초 다지기(https://www.boostcourse.org/ai100)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함