본문 바로가기
Python Object-oriented Programming

Methods

by 자동매매 2023. 4. 2.

출처 : 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

댓글