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

为什么我会收到“TypeError:缺少 1 个必需的位置参数:‘self’”?

Shankar Panda 2月前

108 0

我有一些类似的代码:class Pump: def __init__(self): print(\'init\') def getPumps(self): passp = Pump.getPumps()print(p)但是我收到类似这样的错误:Traceback (

我有一些如下代码:

class Pump:    
    def __init__(self):
        print("init")

    def getPumps(self):
        pass

p = Pump.getPumps()
print(p)

但我收到如下错误:

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\test\test.py", line 7, in <module>
    p = Pump.getPumps()
TypeError: getPumps() missing 1 required positional argument: 'self'

为什么似乎没有 __init__ 被调用,这个异常是什么意思?我的理解是它 self 会自动传递给构造函数和方法。我在这里做错了什么?

帖子版权声明 1、本帖标题:为什么我会收到“TypeError:缺少 1 个必需的位置参数:‘self’”?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Shankar Panda在本站《class》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 要使用该类,首先创建一个实例,如下所示:

    p = Pump()
    p.getPumps()
    

    完整示例:

    >>> class TestClass:
    ...     def __init__(self):
    ...         print("init")
    ...     def testFunc(self):
    ...         print("Test Func")
    ... 
    >>> testInstance = TestClass()
    init
    >>> testInstance.testFunc()
    Test Func
    
  • 您需要先初始化它:

    p = Pump().getPumps()
    
  • 在方法中 @classmethod 添加 Pump.getPumps() .

    类方法接收类作为隐式的第一个参数,就像实例方法接收实例一样。

    class Pump:
        def __init__(self):
            print("init")
    
        @classmethod
        def getPumps(cls):
            pass
    
  • 关键字 self 类似于 this C++/Java/C# 中的关键字。

    在 Python 2 中,它由编译器隐式完成(是的,Python 在内部进行编译)。只是在 Python 3 中,你需要 在构造函数和成员函数中 明确

    class Pump():
        # member variable
        # account_holder
        # balance_amount
    
        # constructor
        def __init__(self,ah,bal):
            self.account_holder = ah
            self.balance_amount = bal
    
        def getPumps(self):
            print("The details of your account are:"+self.account_number + self.balance_amount)
    
    # object = class(*passing values to constructor*)
    p = Pump("Tahir",12000)
    p.getPumps()
    
  • 你说的“在 Python 2 中,它由编译器隐式完成”是什么意思?据我所知,Python 2 从不隐式设置 self。

  • 这不是有效的 Python 代码。您到底想演示什么?首先,Python 注释使用 #,而不是 //;您不需要在类级别声明成员属性;而且这些管道似乎不合适。

  • \'在 Python 2 中,它由编译器隐式完成\'需要引用。

  • Python 2.x 和 Python 3.x 之间存在许多差异,甚至有些差异涉及类的工作方式。但这绝对不是其中之一。除此之外,问题与显式 self 无关。问题只是关于实例化类。

  • 引用 10

    过早采纳 PyCharm 的建议对方法使用 @staticmethod 进行注释也会导致此错误。请删除该注释。

  • 引用 11

    该答案附近的另一种可能性是,如果您将方法声明为@staticmethod,然后将自身包含(或保留)为第一个位置参数。

  • 记住2点

    1. p1

      class Pump:    def __init__(self):
    2. p2

    • p3

    • p4

       p = Pump() p.getPumps()
  • 如果跳过对象声明的括号(拼写错误),就会发生此错误。

    # WRONG! will result in TypeError: getPumps() missing 1 required positional argument: 'self'
    p = Pump
    p.getPumps()
    

    不要忘记 Pump 对象的括号

    # CORRECT!
    p = Pump()
    p.getPumps()
    
  • 我得到了以下同样的错误:

    TypeError:test()缺少 1 个必需的位置参数:“self”

    实例方法 有时 self ,我直接通过类名调用它,如下所示:

    class Person:
        def test(self): # <- With "self" 
            print("Test")
    
    Person.test() # Here
    

    并且,当 静态方法 有时 self ,我通过对象或直接通过类名调用它,如下所示:

    class Person:
        @staticmethod
        def test(self): # <- With "self" 
            print("Test")
    
    obj = Person()
    obj.test() # Here
    
    # Or
    
    Person.test() # Here
    

    因此,我使用对象调用了实例方法,如下所示:

    class Person:
        def test(self): # <- With "self" 
            print("Test")
    
    obj = Person()
    obj.test() # Here
    

    并且,我 self 从静态方法中删除了它,如下所示:

    class Person:
        @staticmethod
        def test(): # <- "self" removed 
            print("Test")
    
    obj = Person()
    obj.test() # Here
    
    # Or
    
    Person.test() # Here
    

    然后,错误就解决了:

    Test
    

    详细地,我 回答 Python 中的“实例方法”是什么?解释 实例方法, 回答 Python 中的 @classmethod vs @staticmethod in @staticmethod @classmethod .

  • 引用 15

    如果未传递函数所需的位置参数,也可能引发此错误。例如,以下内容会触发错误。

    def func(value, *args, **kwargs):
        pass
    
    func()            # <--- TypeError: func() missing 1 required positional argument: 'value'
    func(a=1, b=2)    # <--- TypeError: func() missing 1 required positional argument: 'value'
    
    # passing the required arg solves the issue
    func(30)          # <--- OK
    func(3, a=1, b=2) # <--- OK
    

    上面的例子很简单,但如果 func() 是从模块导入的,那就不那么明显了。例如,numpy 模块的 allclose 函数(检查两个数组是否足够接近)需要两个位置参数。如果你将两个数组作为元组/列表传递,你将在标题中看到 TypeError。

    import numpy as np
    np.allclose(([1, 2], [1, 1]))  # <--- TypeError
    np.allclose([1, 2], [1, 1])    # <--- OK
    
  • 引用 16

     class Person:
            def __init__(self, full_name, uuid, user_type, working_hours=None):
                self.full_name = full_name
                self.uuid = uuid
        
            def load_data(filename):
                print("Data")
               
            
            def load_readers(self):
                return self.load_data("readers.txt")
    
       
    

    class Person:
            def __init__(self, full_name, uuid, user_type):
                self.full_name = full_name
                self.uuid = uuid
                self.user_type = user_type
        
            def load_data(self, filename):
                print("Data")
               
            
            def load_readers(self):
                return self.load_data("readers.txt")
    

    就我的情况而言,该错误是由于函数中缺少 self 关键字引起的 load_data() ,而该关键字在函数中使用 load_readers()

    尝试检查所有函数是否都有 self 关键字

    我如何称呼班级

    if __name__ == '__main__':
            person = Person("Foo", 1222, "READER")
            print(person.load_readers())
    

    因此,不要使用类名,而是首先启动类对象来调用该函数。

返回
作者最近主题: