Подтвердить что ты не робот

Интересно 'принимает ровно 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")?

4b9b3361

Ответ 1

Вызов

e.extractAll("th")

для регулярного метода extractAll() действительно эквивалентен

Extractor.extractAll(e, "th")

Эти два вызова обрабатываются одинаково во всех отношениях, включая сообщения об ошибках, которые вы получаете.

Если вам не нужно передавать экземпляр методу, вы можете использовать staticmethod:

@staticmethod
def extractAll(tag):
    ...

который можно назвать e.extractAll("th"). Но мне интересно, почему это метод в классе вообще, если вам не нужен какой-либо экземпляр.

Ответ 2

Если нестатический метод является членом класса, вы должны определить его следующим образом:

def Method(self, atributes..)

Итак, я полагаю, ваш "e" является экземпляром некоторого класса с реализованным методом, который пытается выполнить и имеет слишком много аргументов.

Ответ 3

Я получаю его, потому что действие вызова его через e.extractAll( "th" ) также передается в качестве аргумента?

Да, это точно. Если вам нравится, первым параметром является имя объекта e, с которым вы вызываете его.

И если это так, удалив self в вызове, я бы сделал это своего рода метод класса, который можно назвать как Extractor.extractAll( "th" )?

Не совсем. Класс-метод нуждается в декораторе @classmethod, и он принимает класс как первый параметр (обычно называемый cls). Единственный метод, который не задает никакого автоматического параметра вообще, известен как статический метод, и для этого снова нужен декоратор (неудивительно, что он @staticmethod). Класс-метод используется, когда это операция, которая должна ссылаться на сам класс: возможно создание объектов класса; staticmethod используется, когда код принадлежит классу логически, но не требует доступа к классу или экземпляру.

Но да, как staticmethods, так и classmethods могут быть вызваны путем ссылки на имя класса, как вы описываете: Extractor.extractAll("th").

Ответ 4

Да, когда вы вызываете e.extractAll(foo), Python перегрызывает это в extractAll(e, foo).

Из http://docs.python.org/tutorial/classes.html

особая вещь о методах что объект передается как первый аргумент функции. В нашем Например, вызов x.f() точно эквивалентно MyClass.f(x). В общий, вызов метода со списком из n аргументов эквивалентно вызов соответствующей функции с созданным списком аргументов путем вставки объекта метода перед первым аргументом.

Добавлен акцент.

Ответ 5

Резюме (некоторые примеры того, как определять методы в классах в python)

#!/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")`

Ответ 6

попробуйте использовать:

def extractAll(self,tag):

внимание к себе