소개
이 랩에서는 Python 에서 객체가 특정 메서드를 가지고 있는지 확인하는 방법을 배우게 됩니다. 이 랩은 객체 메서드에 초점을 맞춰, 조직적이고 재사용 가능한 코드를 위해 객체 내에서 동작을 캡슐화하는 방법을 다룹니다.
__init__, bark, get_name과 같은 메서드를 가진 Dog 클래스를 탐구하고, 인스턴스를 생성하고 이러한 메서드를 호출합니다. 그런 다음, 이 랩은 hasattr() 및 callable()을 사용하여 객체가 특정 메서드를 가지고 있는지 확인하는 방법을 안내합니다. 마지막으로, Method Resolution Order (MRO) 에 대한 이해를 얻게 됩니다.
객체 메서드 학습
이 단계에서는 Python 의 객체 메서드에 대해 배우게 됩니다. 메서드는 객체와 관련된 함수입니다. 객체의 데이터를 조작하는 데 사용됩니다. Python 에서 객체와 클래스로 작업하려면 객체 메서드를 이해하는 것이 중요합니다.
Dog라는 간단한 클래스를 생성하는 것으로 시작해 보겠습니다.
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
return "Woof!"
def get_name(self):
return self.name
VS Code 편집기를 사용하여 ~/project 디렉토리에 dog.py라는 파일을 생성합니다. 위의 코드를 복사하여 dog.py 파일에 붙여넣습니다.
이 클래스에는 세 가지 메서드가 있습니다.
__init__: 이것은 생성자 메서드입니다. 클래스의 새 객체가 생성될 때 호출됩니다. 객체의 속성을 초기화합니다.bark: 이 메서드는 문자열 "Woof!"를 반환합니다.get_name: 이 메서드는 개의 이름을 반환합니다.
이제 Dog 클래스의 객체를 생성하고 해당 메서드를 호출해 보겠습니다. ~/project 디렉토리에 main.py라는 새 파일을 생성합니다.
from dog import Dog
my_dog = Dog("Buddy", "Golden Retriever")
print(my_dog.bark())
print(my_dog.get_name())
main.py 파일을 저장합니다.
main.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python main.py
다음 출력을 볼 수 있습니다.
Woof!
Buddy
이 예에서 my_dog는 Dog 클래스의 객체입니다. 점 표기법 (.) 을 사용하여 my_dog 객체에서 bark 및 get_name 메서드를 호출하고 있습니다.
객체 메서드를 사용하면 객체 내에서 동작을 캡슐화하여 코드를 더 조직적이고 재사용 가능하게 만들 수 있습니다. 이는 Python 에서 객체 지향 프로그래밍의 기본 부분입니다.
hasattr() 및 callable() 로 확인
이 단계에서는 Python 에서 hasattr() 및 callable() 함수를 사용하는 방법을 배우게 됩니다. 이러한 함수는 객체를 검사하고 특정 속성 또는 메서드를 가지고 있는지 확인하는 데 유용합니다.
hasattr(object, attribute_name): 이 함수는 객체에 주어진 속성이 있는지 확인합니다. 속성이 있으면True를 반환하고, 그렇지 않으면False를 반환합니다.callable(object): 이 함수는 객체가 호출 가능한지 (즉, 함수처럼 호출할 수 있는지) 확인합니다. 객체가 호출 가능하면True를 반환하고, 그렇지 않으면False를 반환합니다.
이전 단계에서 사용한 Dog 클래스를 계속 사용해 보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에서 dog.py 파일을 엽니다. 내용은 다음과 같아야 합니다.
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
return "Woof!"
def get_name(self):
return self.name
이제 hasattr() 및 callable()의 사용법을 보여주기 위해 ~/project 디렉토리에 check_methods.py라는 새 파일을 생성해 보겠습니다.
from dog import Dog
my_dog = Dog("Buddy", "Golden Retriever")
print(hasattr(my_dog, "name"))
print(hasattr(my_dog, "bark"))
print(hasattr(my_dog, "age"))
print(callable(my_dog.bark))
print(callable(my_dog.name))
check_methods.py 파일을 저장합니다.
이 예에서:
hasattr(my_dog, "name")은my_dog객체에"name"이라는 속성이 있는지 확인합니다.Dog클래스에name속성이 있으므로True를 반환합니다.hasattr(my_dog, "bark")는my_dog객체에"bark"라는 속성이 있는지 확인합니다.Dog클래스에bark메서드가 있으므로True를 반환합니다.hasattr(my_dog, "age")는my_dog객체에"age"라는 속성이 있는지 확인합니다.Dog클래스에age속성이 없으므로False를 반환합니다.callable(my_dog.bark)는my_dog.bark속성이 호출 가능한지 (즉, 메서드인지) 확인합니다.bark는 메서드이므로True를 반환합니다.callable(my_dog.name)은my_dog.name속성이 호출 가능한지 확인합니다.name은 문자열 속성이므로False를 반환합니다.
check_methods.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python check_methods.py
다음 출력을 볼 수 있습니다.
True
True
False
True
False
이러한 함수는 다양한 유형의 객체와 속성을 처리할 수 있는 더 강력하고 유연한 코드를 작성하는 데 유용합니다.
메서드 결정 순서 (MRO) 이해
이 단계에서는 Python 의 메서드 결정 순서 (MRO) 에 대해 배우게 됩니다. MRO 는 Python 이 클래스 계층 구조에서 메서드를 검색하는 순서입니다. 다중 상속을 다룰 때 특히 중요합니다.
MRO 를 설명하기 위해 새로운 클래스 집합을 만들어 보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에 animal.py라는 파일을 생성합니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
animal.py 파일을 저장합니다.
이제 MRO 를 보여주기 위해 ~/project 디렉토리에 mro_example.py라는 새 파일을 생성합니다.
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
mro_example.py 파일을 저장합니다.
이 예에서:
Animal은speak메서드를 가진 기본 클래스입니다.Mammal은Animal에서 상속받고speak메서드를 재정의합니다.Dog는Mammal에서 상속받고speak메서드를 재정의합니다.Cat은Mammal에서 상속받고speak메서드를 재정의합니다.
my_dog.speak()를 호출하면 Python 은 먼저 Dog 클래스에서 speak 메서드를 찾습니다. 거기에서 찾을 수 없으면 Mammal 클래스에서 찾고, 그 다음 Animal 클래스에서 찾습니다. 이 순서는 MRO 에 의해 결정됩니다.
mro_example.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python mro_example.py
다음 출력을 볼 수 있습니다.
Woof!
Meow!
이제 다중 상속을 사용한 더 복잡한 예를 살펴보겠습니다. ~/project 디렉토리에 mro_complex.py라는 새 파일을 생성합니다.
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
mro_complex.py 파일을 저장합니다.
이 예에서:
- 클래스
D는B와C모두에서 상속받습니다. B와C는 모두A에서 상속받습니다.method는 세 클래스A,B,C모두에서 정의됩니다.
mro_complex.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python mro_complex.py
다음 출력을 볼 수 있습니다.
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
출력 B는 클래스 B의 method가 호출되었음을 나타냅니다. D.mro() 메서드는 클래스 D에 대한 메서드 결정 순서를 나타내는 튜플을 반환합니다. 이 경우 MRO 는 D -> B -> C -> A -> object입니다. 즉, d.method()를 호출하면 Python 은 먼저 클래스 D에서 메서드를 찾고, 그 다음 클래스 B에서, 그 다음 클래스 C에서, 그 다음 클래스 A에서, 마지막으로 기본 클래스 object에서 찾습니다.
MRO 를 이해하는 것은 상속, 특히 다중 상속을 사용할 때 코드의 동작을 예측하는 데 필수적입니다.
요약
이 Lab 에서는 Python 의 객체 메서드를 이해하는 데 중점을 둡니다. 객체 데이터에 대한 작업을 수행하는 데 중요한, 객체와 관련된 함수로서의 메서드 개념을 소개합니다. __init__, bark, get_name과 같은 메서드를 가진 Dog 클래스를 생성하여 객체 내에서 메서드가 어떻게 동작을 캡슐화하는지 보여줍니다.
그런 다음 Lab 에서는 Dog 클래스의 인스턴스를 생성하고 점 표기법을 사용하여 해당 메서드를 호출하는 과정을 안내하여 객체 지향 프로그래밍에서 객체 메서드가 어떻게 구성되고 재사용 가능한 코드에 기여하는지 설명합니다.



