흥미로운 '정확히 1 개의 인수 (2 개 제공)를 취함'Python 오류
오류의 경우 :
TypeError: takes exactly 1 argument (2 given)
다음 클래스 메서드를 사용합니다.
def extractAll(tag):
...
그리고 그것을 부릅니다.
e.extractAll("th")
1 개의 인수를 주면 오류가 매우 이상해 보입니다. 메서드는 1 개의 인수 만 가져야하지만 1 개의 인수를주지 않는다는 것입니다 .... self
메서드 프로토 타입 에 추가하여 문제를 해결할 수 있다는 것을 알고 있습니다. 하지만 오류의 원인을 알고 싶었습니다.
e.
extractAll ( "th")을 통해 호출하는 행위 도 self
인수로 전달 되기 때문에 가져 오는 것 입니까? 그렇다면 self
호출에서 를 제거하면 다음 과 같이 호출 할 수있는 일종의 클래스 메서드를 만들 수 Extractor.extractAll("th")
있습니까?
호출
e.extractAll("th")
일반 방법의 extractAll()
경우 실제로는
Extractor.extractAll(e, "th")
이 두 호출은 오류 메시지를 포함하여 모든면에서 동일하게 처리됩니다.
인스턴스를 메서드에 전달할 필요가없는 경우 다음 을 사용할 수 있습니다 staticmethod
.
@staticmethod
def extractAll(tag):
...
라고 할 수 있습니다 e.extractAll("th")
. 하지만 인스턴스에 액세스 할 필요가 없는데 왜 이것이 클래스의 메서드인지 궁금합니다.
비 정적 메서드가 클래스의 멤버 인 경우 다음과 같이 정의해야합니다.
def Method(self, atributes..)
따라서 'e'는 실행을 시도하고 인수가 너무 많은 구현 된 메서드가있는 일부 클래스의 인스턴스라고 가정합니다.
e.extractAll ( "th")을 통해 호출하는 행위도 self를 인수로 전달하기 때문에 얻습니까?
예, 그게 바로 그것입니다. 원하는 경우 첫 번째 매개 변수는 e
호출 하는 객체 이름 입니다.
그렇다면 호출에서 self를 제거하여 Extractor.extractAll ( "th")처럼 호출 할 수있는 일종의 클래스 메서드를 만들 수 있습니까?
좀 빠지는. classmethod에는 @classmethod
데코레이터 가 필요 하며 이는 클래스 를 첫 번째 매개 변수 (일반적으로 cls
) 로 허용합니다 . 자동 매개 변수가 전혀 제공되지 않는 유일한 방법은 staticmethod로 알려져 있으며, 여기에는 다시 데코레이터가 필요합니다 (당연히 @staticmethod
). 클래스 메서드는 클래스 자체를 참조해야하는 작업 인 경우 사용됩니다. 아마도 클래스의 개체를 인스턴스화 할 수 있습니다. staticmethod는 코드가 논리적으로 클래스에 속하지만 클래스 나 인스턴스에 대한 액세스가 필요하지 않을 때 사용됩니다.
그러나 예, staticmethods와 classmethods는 설명하는대로 클래스 이름을 참조하여 호출 할 수 있습니다 Extractor.extractAll("th")
..
예,을 호출 e.extractAll(foo)
하면 Python이이를 extractAll(e, foo)
.
에서 http://docs.python.org/tutorial/classes.html
메서드의 특별한 점은 객체가 함수의 첫 번째 인수로 전달된다는 것입니다. 이 예에서 xf () 호출은 MyClass.f (x)와 정확히 동일합니다. 일반적으로 n 개의 인수 목록을 사용하여 메서드 를 호출하는 것은 첫 번째 인수 앞에 메서드의 객체를 삽입하여 생성 된 인수 목록을 사용하여 해당 함수를 호출하는 것과 같습니다 .
강조가 추가되었습니다.
요약 (파이썬의 클래스에서 메서드를 정의하는 방법에 대한 몇 가지 예)
#!/usr/bin/env python # (if running from bash)
class Class1(object):
def A(self, arg1):
print arg1
# this method requires an instance of Class1
# can access self.variable_name, and other methods in Class1
@classmethod
def B(cls, arg1):
cls.C(arg1)
# can access methods B and C in Class1
@staticmethod
def C(arg1):
print arg1
# can access methods B and C in Class1
# (i.e. via Class1.B(...) and Class1.C(...))
예
my_obj=Class1()
my_obj.A("1")
# Class1.A("2") # TypeError: method A() must be called with Class1 instance
my_obj.B("3")
Class1.B("4")
my_obj.C("5")
Class1.C("6")`
사용해보십시오 :
def extractAll(self,tag):
자기에 대한 관심
'Development Tip' 카테고리의 다른 글
Linux에서 메일 명령을 사용하여 파일을 첨부하는 방법은 무엇입니까? (0) | 2020.12.07 |
---|---|
부울 값 전환 / 반전 (0) | 2020.12.07 |
Scala 2.9의 "scala.sys.process"는 어떻게 작동합니까? (0) | 2020.12.07 |
MPI : 차단 vs 비 차단 (0) | 2020.12.07 |
MongoDB : 배열 내의 인덱스가 참조하는 배열의 단일 하위 요소를 어떻게 업데이트합니까? (0) | 2020.12.07 |