실례 방법, 유형 방법, 정적 방법의 차이
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는 클래스와 클래스의 실례를 사용하여 호출할 수 있습니다.그러나 클래스와 클래스의 실례에 의존하지 않는 상태.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.