본문 바로가기
Python

[Python] OOP

by busybee-busylife 2024. 7. 17.
반응형

 

nico = {
    "name": "Nico",
    "XP": 1000,
    "team": "Team X",
}

def introduce_player(player):
  name = player["name"]
  team = player["team"]
  print(f"My name is {name} and I play for {team}.")

introduce_player(nico)
#>> My name is Nico and I play for Team X.

introduce_player 함수는 nico를 필요로 하지만

이 상태에서는 introduce_player 안에 아무거나 넣을 수 있다

ex. introduce_player(1234)도 입력할 수 있음 

두 데이터가 연결되어있지만 아무런 제약없이 마음대로 날라다니고(?) 있다 

 

OOP: 필요한 구조와 규칙을 제공한다 

class: 입력 데이터를 정의하고, 그 데이터를 기반으로 동작하는 함수를 정의하는 것을 도와준다 

 

 

class Player:
    def __init__(self, name, xp, team):
        self.name = name 
        self.xp = xp
        self.team = team 

    def introduce_player(self):
        print(f"My name is {self.name} and I play for {self.team}.")

nico = Player(name="Nico", xp=1500, team="X")
nico.introduce_player()
#>> My name is Nico and I play for X.

 

Method

method: class 안의 함수. method의 첫번째 argument는 무조건 self 

              __init__() method: class의 기본 값을 세팅 

class Puppy:
  def __init__(self):
    self.name = "Ruffus"
    self.age = 0.1
    self.breed = "Beagle"
    
ruffus = Puppy()
# ruffus는 Puppy의 종류라고 정의 

print(ruffus.name, ruffus.age, ruffus.breed)
#>> Ruffus 0.1 Beagle
class Puppy:
  def __init__(self, name, breed):  # 이제 name, breed 두 개의 argument를 필수로 입력해야
    self.name = name
    self.age = 0.1
    self.breed = breed

  def __str__(self):
    return f"{self.breed} puppy named {self.name}."

# init 메써드에서 데이터를 정의하고, str 메서드에서 해당 데이터에 접근 

ruffus = Puppy(name="Ruffus", breed="Beagle")
bibi = Puppy(name="Bibi", breed="Dalmatian")
# ruffus, bibi는 Puppy class의 인스턴스(object)

print(ruffus.breed, bibi.breed)
#>> Beagle Dalmatian

print(ruffus, bibi)
#>> Beagle puppy named Ruffus. Dalmatian puppy named Bibi.
class Puppy:
  def __init__(self, name, breed):  # 이제 name, breed 두 개의 argument를 필수로 입력해야
    self.name = name
    self.age = 0.1
    self.breed = breed

  def __str__(self):
    return f"{self.breed} puppy named {self.name}."

  def woof_woof(self):
    print("woof woof")

  def introduce(self):
    self.woof_woof()
    print(f"My name is {self.name} and I amd a baby {self.breed}.")
  # class 안의 method는 다른 method를 호출할 수 있다 

ruffus = Puppy(name="Ruffus", breed="Beagle")
bibi = Puppy(name="Bibi", breed="Dalmatian")

ruffus.introduce()
bibi.introduce()
#>> woof woof
#>> My name is Ruffus and I amd a baby Beagle.
#>> woof woof
#>> My name is Bibi and I amd a baby Dalmatian.

class 안의 method는 다른 method를 호출할 수 있다 

 

 

 

Inheritance

class Dog: 
  def __init__(self, name, age, breed): 
    self.name = name
    self.age = age
    self.breed = breed
# 클래스들의 일반적인 속성들을 분리하여 부모 클래스를 만들었다 

class GuardDog(Dog):
  def rrrrr(self):
    print("stay away!")

class Puppy(Dog):
  def woof_woof(self):
    print("woof woof")

bibi = GuardDog(name="Bibi", age=5, breed="Dalmatian")
ruffus = Puppy(name="Ruffus", age=0.1, breed="Beagle")

bibi.rrrrr()
ruffus.woof_woof()
#>> stay away!
#>> woof woof

별도의 초기화 과정이 필요없다면 하위 클래스에서 __init__ 메서드를 정의하지 않아도 된다 

 

 

class Dog: 
  def __init__(self, name, age, breed): 
    self.name = name
    self.age = age
    self.breed = breed
    # 클래스들의 일반적인 속성들을 분리하여 부모 클래스를 만들었다 
  def sleep(self):
    print("zzzz")

class GuardDog(Dog):
  def __init__(self, name, age, breed):
    super().__init__(
      name,
      5,
      breed,
    )
    self.aggressive = True  # GuardDog만의 속성을 정의 

  def rrrrr(self):
    print("stay away!")

class Puppy(Dog):
  def __init__(self, name, age, breed):
    super().__init__(
      name,
      0.1,
      breed,
    )
    self.spoiled = True  # Puppy만의 속성을 정의
    
  def woof_woof(self):
    print("woof woof")

bibi = GuardDog(name="Bibi", age=5, breed="Dalmatian")
ruffus = Puppy(name="Ruffus", age=0.1, breed="Beagle")

bibi.rrrrr()
ruffus.woof_woof()
#>> stay away!
#>> woof woof

bibi.sleep()
#>> zzzz
# bibi는 부모 클래스의 메서드를 그대로 받음

GuardDog, Puppy 만의 고유의 속성이 필요하다면, 해당 하위클래스(GuardDog, Puppy)에서 init 메서드를 재정의한다

 

반응형

'Python' 카테고리의 다른 글

[Python] Flask basics  (0) 2024.07.18