8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

'TypeError: method() 需要 1 个位置参数,但给出了 2 个',但我只传递了一个

Hounshell 1月前

59 0

如果我有一个类...class MyClass: def method(arg): print(arg)...我用它创建一个对象...my_object = MyClass()...我在其上调用 method(\'foo\') 就像这样......

如果我有一堂课...

class MyClass:

    def method(arg):
        print(arg)

...我用它来创建一个对象...

my_object = MyClass()

... 我 method("foo") 这样称呼它...

>>> my_object.method("foo")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)

...为什么 Python 告诉我我给了它两个参数,而我只给了一个?

帖子版权声明 1、本帖标题:'TypeError: method() 需要 1 个位置参数,但给出了 2 个',但我只传递了一个
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Hounshell在本站《oop》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果函数采用一个位置参数和任何其他变量作为关键字参数,您也可能会收到相同的错误消息。要解决此问题,请将其他变量作为关键字参数传递。

    触发错误的示例:

    def func(value, **kwargs):
        pass
    
    func(1, 2)   # <--- TypeError: func() takes 1 positional argument but 2 were given
    
    func(1, b=2) # <--- OK
    

    另一个更实际的例子:django 的 authenticate() 方法可用于验证用户名和密码等凭据,但它将它们作为关键字参数( docs , 源代码 ),因此出现以下情况:

    from django.contrib.auth import authenticate
    authenticate(username, password)                    # <--- TypeError
    authenticate(username=username, password=password)  # <--- OK
    
  • 如果你在使用 Django 时遇到这种情况,那么这意味着:

    1. 向函数添加一个对象,Django 将理解其余部分,例如
    def display_genre(self, obj):
            return ', '.join(genre.name for genre in obj.genre.all())}
    
    
  • 您实际上应该创建一个类:

    class accum:
        def __init__(self):
            self.acc = 0
        def accumulator(self, var2add, end):
            if not end:
                self.acc+=var2add
            return self.acc
    
  • 就我而言,我忘了添加()

    我是这样调用方法的

    obj = className.myMethod
    

    但它应该是这样的

    obj = className.myMethod()
    
  • @run_the_race 是的,最好读完整个问题,但我有时也会跳过它。因此,我更新了标题以更好地反映问题。

  • @wjandrea,这个答案是针对主题的确切错误消息。我不知道你是怎么想的,但我不读问题,我读的是主题和答案。

  • 我很高兴你找到了解决方案,但这是一个与问题中的问题完全不同的问题。我想说你可以发布自己的问题,但同样的问题已经发布过了:TypeError:__init__ 需要 1 个位置参数,但给出了 2 个。

  • 当我睡眠不足时会出现这个错误,并使用 def 而不是 class

    def MyClass():
        def __init__(self, x):
            self.x = x
    
    a = MyClass(3)
    -> TypeError: MyClass() takes 0 positional arguments but 1 was given
    
  • Kaos 1月前 0 只看Ta
    引用 10

    如果您想在不创建对象的情况下调用方法,您可以将方法更改为静态方法。

    class MyClass:
    
        @staticmethod
        def method(arg):
            print(arg)
    
    MyClass.method("i am a static method")
    
  • 引用 11

    当您没有指定参数号 __init__() 或任何其他寻找的方法时,就会发生这种情况。

    例如:

    class Dog:
        def __init__(self):
            print("IN INIT METHOD")
    
        def __unicode__(self,):
            print("IN UNICODE METHOD")
    
        def __str__(self):
            print("IN STR METHOD")
    
    obj = Dog("JIMMY", 1, 2, 3, "WOOF")
    

    当你运行上述程序时,它会给出如下错误:

    TypeError: __init__() takes 1 positional argument but 6 were given

    我们怎样才能摆脱这个东西?

    只传递参数, __init__() 找什么方法

    class Dog:
        def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText):
            self.name_of_dog = dogname
            self.date_of_birth = dob_d
            self.month_of_birth = dob_m
            self.year_of_birth = dob_y
            self.sound_it_make = dogSpeakText
    
        def __unicode__(self, ):
            print("IN UNICODE METHOD")
    
        def __str__(self):
            print("IN STR METHOD")
    
    
    obj = Dog("JIMMY", 1, 2, 3, "WOOF")
    print(id(obj))
    
  • 谢谢@wjandrea,我不能 100%确定我理解了您的评论,也不知道为什么我的答案会以任何方式提供错误的信息。

  • AMR 1月前 0 只看Ta
    引用 13

    另外,我不认为这是一个类方法的好例子,因为为什么你会希望一个 City 实例影响所有其他实例?比如,为什么 City 类首先有一个国家属性?每个 City 实例不应该定义自己的国家吗?假设我想为东京创建一个 City 实例,为多伦多创建一个;这是不可能的,那么它有什么用呢?这是一个更好的例子,包括一个静态方法。

  • 这个术语是错误的。类方法和静态方法是两个不同的东西。类方法采用 cls,而静态方法没有任何必需参数。

  • 正如其他答案中提到的 - 当您使用实例方法时,您需要将其 self 作为第一个参数传递 - 这是错误的根源。

    除此之外,重要的是要理解,只有实例方法将自身作为第一个参数,才能引用实例

    如果方法是 静态的, 无需传递 self ,而是 cls 传递参数(或 class_ )。

    请参见下面的示例。

    class City:
    
       country = "USA" # This is a class level attribute which will be shared across all instances  (and not created PER instance)
    
       def __init__(self, name, location, population):
           self.name       = name
           self.location   = location
           self.population = population
     
       # This is an instance method which takes self as the first argument to refer to the instance 
       def print_population(self, some_nice_sentence_prefix):
           print(some_nice_sentence_prefix +" In " +self.name + " lives " +self.population + " people!")
    
       # This is a static (class) method which is marked with the @classmethod attribute
       # All class methods must take a class argument as first param. The convention is to name is "cls" but class_ is also ok
       @classmethod
       def change_country(cls, new_country):
           cls.country = new_country
    

    进行一些测试只是为了让事情更清楚:

    # Populate objects
    city1 = City("New York",    "East", "18,804,000")
    city2 = City("Los Angeles", "West", "10,118,800")
    
    #1) Use the instance method: No need to pass "self" - it is passed as the city1 instance
    city1.print_population("Did You Know?") # Prints: Did You Know? In New York lives 18,804,000 people!
    
    #2.A) Use the static method in the object
    city2.change_country("Canada")
    
    #2.B) Will be reflected in all objects
    print("city1.country=",city1.country) # Prints Canada
    print("city2.country=",city2.country) # Prints Canada
    
  • @LittleBrain:是的,如果您希望在函数中将它们视为列表 (/dict),则可以传递列表 (或 dict)。但是,如果您希望在函数中解包它们的各个值并与参数 (/kwargs) 匹配,则需要 *args (/**kwargs) 语法。

  • yxk 1月前 0 只看Ta
    引用 17

    从 JavaScript 开始,我希望能够将列表或字典作为参数传递。但 Python 似乎不是这样工作的:您必须使用 * 或 ** 解构列表,后者用于关键字参数列表。

  • 此问题也可能是由于未能 将关键字参数传递 给函数而导致的。

    例如,给定一个定义如下的方法:

    def create_properties_frame(self, parent, **kwargs):
    

    像这样的调用:

    self.create_properties_frame(frame, kw_gsp)
    

    将导致 TypeError: create_properties_frame() takes 2 positional arguments but 3 were given ,因为 kw_gsp 字典被视为位置参数而不是被解包成单独的关键字参数。

    解决方案是添加 ** 以下参数:

    self.create_properties_frame(frame, **kw_gsp)
    
  • 我很高兴您找到了解决方案,但这个问题与问题中的问题完全不同。我想说您可以发布自己的问题,但已经有人发布过类似问题,例如: \'This construction takes no parameters\' error in __init__ (拼写错误为 _init_)。

  • 我也遇到了同样的事情,但使用的是 __int__(self, ...):。因为那个拼写错误浪费了几个小时。

返回
作者最近主题: