본문 바로가기
파이썬(Python)/파이썬 지식

파이썬 클래스에 대한 모든 것 __init__, __call__, 상속

by 기계공학 주인장 2023. 11. 14.
반응형

이번 포스팅에서는 파이썬에서 클래스를 정의하는 방법과 클래스 상속에 대해 알아보겠습니다.

 

이해를 위해 이전 포스팅을 보는 것을 추천드립니다.

 

파이썬의 모듈에 대한 모든 것 feat. __name__?, __init__?

저는 다른 프로그래밍 언어를 공부했기 때문에 기본적인 문법은 금방 익힐 수 있지만 파이썬의 모듈에 대한 내용이 조금 생소했습니다. 파이썬의 모듈, 패키지를 다루다보면 반드시 마주치는

android-developer.tistory.com


def __init__으로 클래스의 생성자 정의하기

파이썬에서 클래스의 생성자는 다음과 같은 방법으로 지정할 수 있습니다.

 

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))

 

파이썬에서 클래스는 def __init__(self)를 통해 생성자를 초기화할 수 있습니다.

 

클래스를 호출할 때 __init__ 안에 있는 내용들이 발동한다.                                                                                                                                                                                                                                                                                                                                                                       

 

if __name__ == "__main__": 을 사용하여 호출하면

 

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))


if __name__ == "__main__":
    marine1 = Unit("해병", 45, 5)

 

다음과 같은 결과를 출력한다.

 

 

또한 초기화된 생성자는 밖에서도 다음과 같이 사용할 수 있다


클래스 인스턴스를 사용하여 멤버변수를 클래스 밖에서 사용하기

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))


if __name__ == "__main__":
    marine1 = Unit("해병", 45, 5)
    # 초기화된 클래스의 생성자는 다음과 같이 사용할 수 있다.
    print("유닛 이름: {}".format(marine1.name))
    print("유닛 체력: {}".format(marine1.hp))
    print("유닛 공격력: {}".format(marine1.damage))

 

 


클래스 확장하기

클래스에 . 붙이는 것만으로도 해당 인스턴스에 값을 추가할 수 있습니다.

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))


if __name__ == "__main__":
    marine1 = Unit("해병", 45, 5)
    # 초기화된 클래스의 생성자는 다음과 같이 사용할 수 있다.
    print("유닛 이름: {}".format(marine1.name))
    print("유닛 체력: {}".format(marine1.hp))
    print("유닛 공격력: {}".format(marine1.damage))

    # marine1 인스턴스에 동적 변수 추가
    marine1.dead = True

    def custom_ability():
        print("임으로 추가된 유닛의 기능")
    # marine1 인스턴스에 동적 함수 추가
    marine1.custom_ability = custom_ability

    if marine1.dead:
        print("{} 유닛이 죽었습니다".format(marine1.name))
        marine1.custom_ability()

 


메서드 사용하기 

파이썬에서 메서드에 self를 사용하면 해당 클래스에서 정의한 생성자 값을 전부 사용할 수 있게 된다.

 

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))

    # self를 매개변수로 받는 함수
    def attack(self, location):
        # 클래스의 생성자를 참조해서 사용할 수 있다
        print("{}이(가) {} 방향으로 적을 공격합니다.".format(self.name, location))

if __name__ == "__main__":
    marine1 = Unit("해병", 45, 5)

    # marine1 인스턴스에 동적 변수 추가
    marine1.dead = True

    marine1.attack("5시")

 

출력하면 다음과 같은 결과가 나온다

 

 


파이썬 클래스에서 def __call__() 의미

예를 들면 다음과 같은 클래스가 있습니다.

 

class DataProcessor:
    def __call__(self, inputs: dict):
        name = inputs.get('name', 'Unknown')
        age = inputs.get('age', 0)
        return f"처리된 데이터: 이름 - {name}, 나이 - {age}"

 

파이썬 클래스에서 __call__ 메서드는 다음과 같은 역할을 합니다.

 

 

클래스의 인스턴스를 함수처럼 호출해서 사용할 수 있습니다.

 

 

예를 들면 위 코드는 다음과 같이 사용할 수 있습니다.

 

# DataProcessor 클래스로 인스턴스 생성
processor = DataProcessor()

# processor 변수에 직접 파라미터 입력 가능
result = processor({'name': '김철수', 'age': 30})

# 처리된 데이터: 이름 - 김철수, 나이 - 30
print(result)

클래스 상속

파이썬에서 클래스 상속은 다음과 같은 형태로 할 수 있다.

 

class 부모클래스:
    # 부모 클래스의 속성과 메서드 정의

class 자식클래스(부모클래스):
    # 자식 클래스의 속성과 메서드 정의

 

부모클래스를 2개 이상 지정하여 2개 이상의 클래스에서 상속을 받을 수도 있다.

 

class 부모클래스1:
    # 부모 클래스의 속성과 메서드 정의
    
class 부모클래스2:
    # 부모 클래스의 속성과 메서드 정의

class 자식클래스(부모클래스1, 부모클래스2):
    # 자식 클래스의 속성과 메서드 정의

 

예를 들면 다음과 같이 쓸 수 있습니다.

 

class Unit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage
        print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))

    # self를 매개변수로 받는 함수
    def attack(self, location):
        # 클래스의 생성자를 참조해서 사용할 수 있다
        print("{}이(가) {} 방향으로 적을 공격합니다.".format(self.name, location))


# Unit 클래스를 상속한 클래스 생성
class AttackUnit(Unit):
    def __init__(self, name, hp, damage):
        # 부모 클래스(Unit)에 정의한 메서드를 그대로 사용하고 싶으면 여기서도 초기화를 해줘야한다.
        # 그렇기 때문에 부모 클래스의 init 부분이 호출됨
        Unit.__init__(self, name, hp, damage)
        # super()를 사용하면 부모 클래스에 있는 메서드를 사용할 수 있다.
        super().attack("5시")


if __name__ == "__main__":
    marine1 = AttackUnit("해병", 45, 5)
    marine1.attack("8시")

 


다른 참고하면 좋은 포스팅

 

 

파이썬의 모듈에 대한 모든 것 feat. __name__?, __init__?

저는 다른 프로그래밍 언어를 공부했기 때문에 기본적인 문법은 금방 익힐 수 있지만 파이썬의 모듈에 대한 내용이 조금 생소했습니다. 파이썬의 모듈, 패키지를 다루다보면 반드시 마주치는

android-developer.tistory.com

 

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글