출처 : https://www.pythontutorial.net/python-oop/python-methods/
Introduction to the Python methods
정의에 따라 메서드는 클래스의 인스턴스에 바인딩된 함수입니다.
내부적으로 어떻게 작동하는지 이해하는 데 도움이 됩니다.
다음은 send() 함수를 포함하는 Request 클래스를 정의합니다.
class Request:
def send(): # 주의 : 인수로 self, cls 가 없다
print('Sent')
그리고 다음과 같이 Request 클래스를 통해 send() 함수를 호출할 수 있습니다.
Request.send() # Sent
send()는 함수 객체로, 다음 출력에 표시된 대로 함수 클래스의 인스턴스입니다.
print(Request.send)
Output:
<function Request.send at 0x00000276F9E00310>
send의 type은 함수입니다.
print(type(Request.send))
Output:
<class 'function'>
다음은 Request 클래스의 새 인스턴스를 만듭니다.
http_request = Request()
http_request.send를 print하면 바인딩된 메서드 개체가 반환됩니다.
print(http_request.send)
Output:
<bound method Request.send of <__main__.Request object at 0x00000104B6C3D580>>
따라서 http_request.send 는 Request.send와 같은 함수가 아닙니다. 다음은 Request.send가 http_request.send와 동일한 개체인지 확인합니다. 예상대로 False를 반환합니다.
print(type(Request.send) is type(http_request.send))
그 이유는 아래와 같이 Request.send의 type은 함수이고 http_request.send의 type은 메서드이기 때문입니다.
print(type(http_request.send)) # <class 'method'>
print(type(Request.send)) # <class 'function'>
따라서 클래스 내에서 함수를 정의하면 순전히 함수입니다. 그러나 객체를 통해 해당 함수에 액세스하면 함수는 메서드가 됩니다.
따라서 메서드는 클래스의 인스턴스에 바인딩된 함수입니다.
http_request 객체를 통해 send() 함수를 호출하면 다음과 같이 TypeError가 표시됩니다.
http_request.send()
Error:
TypeError: send() takes 0 positional arguments but 1 was given
http_request.send는 http_request 객체에 바인딩된 메서드이기 때문에 Python은 항상 암시적으로 객체를 메서드에 첫 번째 인수로 전달합니다.
다음은 send 함수가 인수 목록을 허용하는 Request 클래스를 다시 정의합니다.
class Request:
def send(*args):
print('Sent', args)
다음은 request 클래스에서 send 함수를 호출합니다.
Request.send()
Output:
Sent ()
send() 함수는 인수를 수신하지 않습니다.
그러나 Request 클래스의 인스턴스에서 send() 함수를 호출하면 args가 비어 있지 않습니다.
( 비록 이름이 self는 아니지만 객체를 받는다. )
http_request.send()
Output:
Sent (<__main__.Request object at 0x000001374AF4D580>,)
이 경우 send() 메서드는 바인딩된 객체인 http_request인 객체를 수신합니다.
다음은 send() 메서드를 호출하는 객체가 파이썬이 암시적으로 메서드에 첫 번째 인수로 전달하는 객체임을 보여줍니다.
print(hex(id(http_request)))
http_request.send()
Output:
0x1ee3a74d580
Sent (<__main__.Request object at 0x000001EE3A74D580>,)
http_request 객체는 메모리 주소가 동일하기 때문에 파이썬이 send() 메서드에 첫 번째 인수로 전달하는 객체로서 동일합니다. 즉, send() 메서드 내의 첫 번째 인수로 클래스의 인스턴스에 액세스할 수 있습니다.
다음 메서드 호출:
http_request.send()
위와 동일
Request.send(http_request)
이러한 이유로 객체의 메서드는 항상 객체를 첫 번째 인수로 갖습니다. 관례에 따라, 그것은 self라고 불린다 :
class Request:
def send(self):
print('Sent', self)
Java 또는 C#과 같은 다른 프로그래밍 언어로 작업한 경우 self는 this와 동일합니다.
Summary
- 클래스 내에서 함수를 정의하면 순수 함수입니다.
그러나 클래스의 인스턴스를 통해 함수를 호출하면 함수가 메서드가 됩니다. 따라서 메서드는 클래스의 인스턴스에 바인딩된 함수입니다. - 메서드는 메서드 클래스의 인스턴스입니다.
- 메서드에는 바인딩된 개체가 첫 번째 인수(self)가 됩니다.
- 파이썬은 자동으로 bound 객체를 첫 번째 인수로 메서드에 전달합니다. 관례에 따라 그 이름은 self입니다.
'Python Object-oriented Programming' 카테고리의 다른 글
__init__ Method (0) | 2023.04.03 |
---|---|
Class Methods (0) | 2023.04.02 |
Class Variables (0) | 2023.04.02 |
Class attributes (0) | 2023.04.02 |
Class (0) | 2023.04.02 |
댓글