실례 방법, 유형 방법, 정적 방법의 차이

4427 단어
저자: 요강강 링크 주소 출처: 본 편이 필자의 메모리 라이브러리로 전래된 것을 알고 있습니다. 무례한 일이 있으면 즉시 필자에게 연락하십시오.

method란 무엇입니까?


function은 이름을 통해 호출할 수 있는 코드입니다. 파라미터를 보내서 값을 되돌릴 수 있습니다.모든 매개 변수는 명확하게 전달된다.method는function과 대상의 결합이다.우리가 방법을 호출할 때, 어떤 매개 변수는 은밀하게 전달된다.다음 글은 상세하게 소개하겠습니다.

instancemethod

class Human(object):
    def __init__(self, weight):
        self.weight = weight
    def get_weight(self):
        return self.weight

In [6]: Human.get_weight
Out[6]: 

이거는 get_를 알려줘요.weight는 귀속되지 않은 방법입니다. 무엇이 미귀속이라고 합니까?계속 봐.
In [7]: Human.get_weight()
TypeError                                 Traceback (most recent call last)
/home/yao/learn/insight_python/ in ()
----> 1 Human.get_weight()

TypeError: unbound method get_weight() must be called with Human instance as first argument (got nothing instead)

귀속되지 않은 방법은 반드시 Human 실례를 첫 번째 매개 변수로 사용해야 합니다.그럼 한번 해볼게요.
In [10]: Human.get_weight(Human(45))
Out[10]: 45

역시 성공했지만, 일반적인 상황에서 우리는 이렇게 사용하는 것에 익숙하다.
In [11]: person = Human(45)
In [12]: person.get_weight()
Out[12]: 45

이 두 가지 방식의 결과는 똑같다.우리는 공식 문서가 이런 현상을 어떻게 해석하는지 좀 봅시다.When an instance attribute is referenced that isn’t a data attribute, its class is searched. If the name denotes a valid class attribute that is a function object, a method object is created by packing (pointers to) the instance object and the function object just found together in an abstract object: this is the method object. When the method object is called with an argument list, a new argument list is constructed from the instance object and the argument list, and the function object is called with this new argument list. 원래 우리가 자주 사용하는 호출 방법 (person.get_weight () 은 호출된 실례를 하나의 매개 변수self로 숨기고 전달하는 것입니다. self는 일반적인 매개 변수 이름일 뿐, 키워드가 아닙니다.
In [13]: person.get_weight
Out[13]: >

In [14]: person
Out[14]: <__main__.human at="">

우리 get_ 봤어.weight는person이라는 실례 대상에 귀속되어 있습니다.요약: instance method는 실례 대상과 함수의 결합이다.클래스 호출을 사용하면 첫 번째 매개 변수가 과거의 실례를 명확하게 전달합니다.실례 호출을 사용하면 호출된 실례가 첫 번째 매개 변수로 은밀하게 전달됩니다.

classmethod

In [1]: class Human(object):
   ...:     weight = 12
   ...:     @classmethod
   ...:     def get_weight(cls):
   ...:         return cls.weight

In [2]: Human.get_weight
Out[2]: >

우리 get_ 봤어.weight는 Human 클래스에 연결된 method입니다.호출해 봐.
In [3]: Human.get_weight()
Out[3]: 12
In [4]: Human().get_weight()
Out[4]: 12

클래스와 클래스의 실례는 모두 get_weight 그리고 호출 결과는 똑같습니다.weight는 Human 클래스에 속하는 속성이며 당연히 Human의 실례적인 속성이기도 하다.그러면 과거의 매개 변수cls는 클래스입니까 아니면 실례입니까?
In [1]: class Human(object):
   ...:     weight = 12
   ...:     @classmethod
   ...:     def get_weight(cls):
   ...:         print cls 

In [2]: Human.get_weight()


In [3]: Human().get_weight()


우리는 과거를 전달하는 것은 모두 Human류이지 Human의 실례가 아니며 두 가지 방식으로 호출한 결과는 아무런 차이가 없다는 것을 보았다.cls는 일반적인 함수 매개 변수일 뿐, 호출할 때 은밀하게 전달됩니다.총괄:classmethod는 클래스 대상과 함수의 결합이다.클래스의 실례를 사용할 수 있지만, 클래스를 은밀한 매개 변수로 전달합니다.클래스를 사용하여classmethod를 호출하면 클래스를 실례화하는 비용을 피할 수 있습니다.

staticmethod

In [1]: class Human(object):
   ...:     @staticmethod
   ...:     def add(a, b):
   ...:         return a + b
   ...:     def get_weight(self):
   ...:         return self.add(1, 2)

In [2]: Human.add
Out[2]: 

In [3]: Human().add
Out[3]: 

In [4]: Human.add(1, 2)
Out[4]: 3

In [5]: Human().add(1, 2)
Out[5]: 3

우리는add가 클래스든 실례든 모두 일반적인 함수일 뿐 특정한 클래스나 실례에 귀속되지 않은 것을 보았다.클래스나 클래스의 실례를 사용하여 호출할 수 있으며, 어떠한 은밀한 매개 변수의 전송도 없습니다.
In [6]: Human().add is Human().add
Out[6]: True

In [7]: Human().get_weight is Human().get_weight
Out[7]: False

add는 두 실례에서도 같은 대상이다.instancemethod는 달라요. 매번 새로운 get_weight 대상.요약: 하나의 함수가 논리적으로 하나의 클래스에 속하고 클래스의 속성에 의존하지 않을 때staticmethod를 사용할 수 있다.staticmethod를 사용하면 사용할 때마다 대상을 만드는 비용을 피할 수 있습니다.staticmethod는 클래스와 클래스의 실례를 사용하여 호출할 수 있습니다.그러나 클래스와 클래스의 실례에 의존하지 않는 상태.

좋은 웹페이지 즐겨찾기