파이썬에서 "클래스 메소드"와 "인스턴스 메소드"란 무엇입니까?
"인스턴스 방법"은 인스턴스에 포함 된 정보를 사용하여 반환 할 값 (또는 어떤 부작용)을 파악합니다. 이들은 매우 일반적입니다.
"클래스 메소드"는 클래스 (및 해당 클래스의 인스턴스가 아닌)에 대한 정보를 사용하여 수행하는 작업에 영향을줍니다 (일반적으로 대체 생성자로 새 인스턴스를 작성하는 데 사용되므로 매우 일반적이지 않습니다).
"정적 메서드"는 클래스 또는 인스턴스에 대한 정보를 사용하여 수행하는 작업을 계산하지 않습니다. 편의상 보통 수업 시간에 있습니다. (따라서 이것도 흔하지 않습니다.)
X의 기능
수학 클래스를 기억하십시오. "y는 x의 함수 f(x)
입니까?" 코드로 적용 해 봅시다 :
y = function(x)
상기 암시이다 때문에 x
변경 될 y
때 변경 될 수 x
변경. 이것이 " y
는 " 의 함수입니다 x
.
무엇을 할 y
때 일 z
이다 1
? 2
? 'FooBarBaz'
?
y
의 함수가 아니다 z
, 그래서 z
아무것도 할 수없는 우리의 가정 기능의 결과에 영향을 줄 function
수있는 순수한 기능을. ( z
글로벌 변수로 액세스 하면 순수한 기능이 아닙니다. 이것이 기능적 순도를 의미합니다.)
다음 설명을 읽을 때 위의 사항을 명심하십시오.
인스턴스 메소드
인스턴스 메소드는 함수 인 함수 의 인스턴스 . 이 함수는 인스턴스를 암시 적으로 인수로 받아들이고 함수의 인스턴스는 함수의 출력을 결정하는 데 사용됩니다.
인스턴스 메소드의 내장 예제는 str.lower입니다.
>>> 'ABC'.lower()
'abc'
str.lower
문자열의 인스턴스에서 호출되고 인스턴스에 포함 된 정보를 사용하여 반환 할 새 문자열을 찾습니다.
수업 방법 :
파이썬에서는 모든 것이 객체라는 것을 기억하십시오. 이것은 클래스가 객체이고 함수에 인수로 전달 될 수 있음을 의미합니다.
클래스 메소드는 함수 인 함수 의 클래스 . 그것은 클래스를 그것에 대한 인수로 받아들입니다.
내장 된 예는 dict.fromkeys
다음과 같습니다.
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
이 함수는 암시 적으로 자체 클래스를 알고 있으며 클래스를 사용하여 함수의 출력에 영향을 미치고 iterable에서 해당 클래스의 새 클래스를 작성합니다. OrderedDict는 동일한 방법을 사용할 때이를 보여줍니다.
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
클래스 메소드는 클래스에 대한 정보 (및 해당 클래스의 인스턴스가 아님)를 사용하여 리턴 할 클래스 유형에 영향을줍니다.
정적 방법
"클래스를 모른다"는 메소드를 언급했다. 이것은 파이썬에서 정적 메소드이다. 단지 클래스 객체에 편의를 위해 첨부됩니다. 선택적으로 다른 모듈에서 별도의 함수일 수 있지만 호출 서명은 동일합니다.
정적 메소드는 클래스 나 객체의 함수가 아닙니다.
정적 메소드의 내장 예제는 Python 3의 str.maketrans입니다.
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
몇 가지 인수가 주어지면 클래스의 기능이 아닌 사전을 만듭니다.
str
전역 네임 스페이스에서 항상 사용할 수 있기 때문에 편리하므로 translate 함수와 함께 쉽게 사용할 수 있습니다.
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Python 2에서는 string
모듈 에서 액세스해야 합니다.
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'str' has no attribute 'maketrans'
>>> import string
>>> 'abracadabra'.translate(string.maketrans('abc', 'bca'))
'bcrbabdbcrb'
예
class AClass(object):
"""In Python, a class may have several types of methods:
instance methods, class methods, and static methods
"""
def an_instance_method(self, x, y, z=None):
"""this is a function of the instance of the object
self is the object's instance
"""
return self.a_class_method(x, y)
@classmethod
def a_class_method(cls, x, y, z=None):
"""this is a function of the class of the object
cls is the object's class
"""
return cls.a_static_method(x, y, z=z)
@staticmethod
def a_static_method(x, y, z=None):
"""this is neither a function of the instance or class to
which it is attached
"""
return x, y, z
인스턴스화하자 :
>>> instance = AClass()
이제 인스턴스는 모든 메소드를 호출 할 수 있습니다.
>>> instance.an_instance_method('x', 'y')
('x', 'y', None)
>>> instance.a_static_method('x', 'y')
('x', 'y', None)
>>> instance.a_class_method('x', 'y')
('x', 'y', None)
그러나 클래스는 일반적으로 인스턴스 메소드를 호출하려는 것이 아니지만 다른 메소드를 호출해야합니다.
>>> AClass.a_class_method('x', 'y')
('x', 'y', None)
>>> AClass.a_static_method('x', 'y')
('x', 'y', None)
>>> AClass.an_instance_method('x', 'y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an_instance_method() missing 1 required positional argument: 'y'
인스턴스 메소드를 호출하려면 인스턴스를 명시 적으로 전달해야합니다.
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)