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

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

Dazzler 1月前

38 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 除非注明,本帖由Dazzler在本站《oop》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 该消息有无数原因;这里的具体原因是所有实例方法都需要一个第一个参数,按照惯例我们称之为

  • 在 Python 中,如下所示:

    my_object.method("foo")
    

    ... 是 语法糖 ,解释器在后台将其翻译成:

    MyClass.method(my_object, "foo")
    

    ...如您所见,它确实有两个参数 - 只是从调用者的角度来看,第一个参数是隐含的。

    这是因为大多数方法都会对调用它们的对象进行一些操作,因此需要有某种方式在方法内部引用该对象。按照惯例,第一个参数 self 在方法定义中调用:

    class MyNewClass:
    
        def method(self, arg):
            print(self)
            print(arg)
    

    如果你调用 method("foo") 的实例 MyNewClass ,它会按预期工作:

    >>> my_new_object = MyNewClass()
    >>> my_new_object.method("foo")
    <__main__.MyNewClass object at 0x29045d0>
    foo
    

    偶尔(但不经常),您确实关心您的方法绑定到的对象,在这种情况下,您可以 使用内置的 装饰 staticmethod() ,如下所示:

    class MyOtherClass:
    
        @staticmethod
        def method(arg):
            print(arg)
    

    ...在这种情况下,您不需要 self 向方法定义添加参数,它仍然有效:

    >>> my_other_object = MyOtherClass()
    >>> my_other_object.method("foo")
    foo
    
  • 您能否在此详细说明一下这一点:“偶尔(但不经常),您真的不关心方法所绑定的对象...”我有 Java 和 .NET 背景,并且我经常将方法组织到适当的类中以进行分组/组织。这在 Python 中是否也有效?

  • @joeschmoe54321 在 Python 中,您通常使用模块和包来分组函数,而不是类。

  • 简单来说

    在 Python 中,您应该将其 self 作为第一个参数添加到类中所有定义的方法中:

    class MyClass:
      def method(self, arg):
        print(arg)
    

    然后你可以根据你的直觉使用你的方法:

    >>> my_object = MyClass()
    >>> my_object.method("foo")
    foo
    

    为了更好地理解,您还可以阅读这个问题的答案: 自我的目的是什么?

  • 这个答案有什么问题?为什么有人给她负分?毕竟,这是问题的答案,与其他答案相比,它的简单性与众不同,这对于一些正在寻找答案的人来说可能很重要。不是吗?

  • 认为应该将 self 参数添加到类中所有已定义的方法中是错误的。在上面的示例中,方法内部没有 self 的用处,因此可以使用 @staticmethod 修饰它,这样就不需要创建类的实例。您可以在此处阅读更多相关信息:docs.python.org/3/library/…

  • 也可以使用@classmethods,它将 cls 作为其第一个参数,而不是 self。

  • 遇到此类错误时还需要考虑以下几点:

    我遇到了这个错误消息,发现这篇文章很有帮助。结果发现,在我的情况下,我覆盖了 __init__() 存在对象继承的地方。

    继承的示例相当长,因此我将跳到一个不使用继承的更简单的示例:

    class MyBadInitClass:
        def ___init__(self, name):
            self.name = name
    
        def name_foo(self, arg):
            print(self)
            print(arg)
            print("My name is", self.name)
    
    
    class MyNewClass:
        def new_foo(self, arg):
            print(self)
            print(arg)
    
    
    my_new_object = MyNewClass()
    my_new_object.new_foo("NewFoo")
    my_bad_init_object = MyBadInitClass(name="Test Name")
    my_bad_init_object.name_foo("name foo")
    

    结果是:

    <__main__.MyNewClass object at 0x033C48D0>
    NewFoo
    Traceback (most recent call last):
      File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
        my_bad_init_object = MyBadInitClass(name="Test Name")
    TypeError: object() takes no parameters
    

    PyCharm 没有发现这个拼写错误。Notepad++ 也没有(其他编辑器/IDE 可能会发现)。

    当然,这是一个“不接受参数”的类型错误,就 Python 中的对象初始化而言,它与预期一个参数时得到的“得到两个”并没有太大区别。

    讨论主题:如果语法正确,将使用重载初始化程序,但如果语法不正确,它将被忽略,而改用内置函数。对象不会期望/处理这一点,并且会抛出错误。

    如果出现语法错误:修复很简单,只需编辑自定义 init 语句:

    def __init__(self, name):
        self.name = name
    
  • 这里没有 SyntaxError。代码在语法上是正确的;它只是正确地定义了一个名为 ___init__ 的方法,没有人会调用该方法,而不是特殊方法 __init__。这就是为什么没有检测到错误的原因——因为没有错误可检测。

  • 引用 12

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

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

  • 引用 14

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

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

    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)
    
  • 来自 JavaScript,我期望能够将列表或字典作为参数传递。但 Python 似乎不是这样工作的:您必须使用 * 或 ** 解构列表,后者用于关键字参数列表。

  • 引用 16

    @LittleBrain:是的,如果您希望在函数中将它们视为列表 (/dict),则可以传递列表 (或 dict)。但是,如果您希望在函数中解包它们的各个值并与参数 (/kwargs) 匹配,则需要 *args (/**kwargs) 语法。

  • 正如其他答案中提到的 - 当您使用实例方法时,您需要将其 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
    
  • Alom 1月前 0 只看Ta
    引用 18

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

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

  • 谢谢@wjandrea,我不能 100%确定我理解了您的评论,也不知道为什么我的答案会以任何方式提供错误的信息。

返回
作者最近主题: