Development Tip

흥미로운 '정확히 1 개의 인수 (2 개 제공)를 취함'Python 오류

yourdevel 2020. 12. 7. 20:58
반응형

흥미로운 '정확히 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):

자기에 대한 관심

참고URL : https://stackoverflow.com/questions/4909585/interesting-takes-exactly-1-argument-2-given-python-error

반응형