类型错误:__init__() 缺少 1 个必需的位置参数

目录

TypeError: __init__() missing 1 required positional argument

  1. TypeError: _ _ init _ _ () 缺少 1 个必需的位置参数
  2. 类型错误:缺少 2 个必需的位置参数

TypeError: _ _ init _ _ () 缺少 1 个必需的位置参数

Python“TypeError: _ init _ _ () missing 1 required positional argument”发生在我们在实例化一个类时忘记提供一个必需的参数

要解决该错误,请在实例化类时指定参数或为参数设置默认值。

typeerror init 缺少 1 个必需的位置参数

下面是错误如何发生的示例。

主程序
class Employee(): # 👇️ takes `name` arg def __init__(self, name): self.name = name def get_name(self): return self.name # ⛔️ TypeError: Employee.__init__() missing 1 required positional argument: 'name' emp1 = Employee()

我们尝试实例化该类Employee,但没有为
name导致错误的参数提供值。

为参数提供一个值来解决错误

解决错误的一种方法是为参数提供一个值。

主程序
class Employee(): def __init__(self, name): self.name = name def get_name(self): return self.name # 👇️ make sure to pass the argument emp1 = Employee('Bobby Hadz') print(emp1.name) # 👉️ "Bobby Hadz"
当我们实例化一个类时,我们应该提供我们在类的方法中指定的所有参数(自动传递的参数__init__()除外)。 self

当一个类定义了
_ _ init _ _ ()方法时,该方法在创建实例时被调用。

如果您的类没有定义__init__()方法,则在实例化它时不必传递任何参数。

如果在实例化类时传递参数,则参数将传递给方法__init__()

使用参数的默认值来解决错误

另一种解决方案是为参数设置默认值。

主程序
class Employee(): # 👇️ set default value for `name` arg def __init__(self, name=''): self.name = name def get_name(self): return self.name emp1 = Employee() print(emp1.name) # 👉️ "" emp2 = Employee('Bobby Hadz') print(emp2.name) # 👉️ "Bobby Hadz"

我们将空字符串设置为参数的默认值name

现在,我们不需要在实例化类时为参数提供值。

请注意,该方法采用的第一个参数__init__()self

您可以将此参数命名为任何名称,因为该名称self在 Python 中没有特殊含义。

self表示该类的一个实例,因此当我们将一个变量赋值为 时
self.my_var = 'some value',我们声明了一个实例变量——每个实例的唯一变量。

如果您收到错误“TypeError: missing 1 required positional argument: ‘self’”,请查看以下
文章

使用硬编码的初始值来解决错误

如果您只是硬编码方法中参数的初始值
__init__(),您可以删除它并硬编码方法中的值。

主程序
class Employee(): # 👇️ removed arg def __init__(self): # 👇️ hardcoded value self.name = "Bobby Hadz" def get_name(self): return self.name emp1 = Employee() print(emp1.name) # 👉️ "Bobby Hadz"

我们硬编码实例变量的值name并将其设置为“Bobby Hadz”。

现在每个新实例都将有一个name属性设置为“Bobby Hadz”。

您可以稍后在您的代码中更新该属性的值,例如
emp1.name = 'Alice'

避免为非原始参数设置默认值

一个重要的注意事项是避免为非原始参数设置默认值,例如字典和列表。

这是一个如何出错的示例。

主程序
class Employee(): # 👇️ default arg of type dict def __init__(self, address={}): self.address = address emp1 = Employee() emp2 = Employee() emp1.address['country'] = 'Germany' print(emp1.address['country']) # 👉️ "Germany" print(emp2.address['country']) # 👉️ "Germany"

我们创建了 2 个实例并更新了address第 1 个实例,但更改反映在两个实例中。

这是因为默认参数只被评估一次——当函数被定义时。

每次调用函数时都不会评估它们。

当像字典或列表这样的非原始默认参数发生变化时,它会为所有函数调用发生变化。

解决此问题的一种方法是将默认参数设置为None并有条件地更新其在函数主体中的值。

主程序
class Employee(): def __init__(self, address=None): self.address = address if address is None: self.address = {} emp1 = Employee() emp2 = Employee() emp1.address['country'] = 'Germany' print(emp1.address['country']) # 👉️ "Germany" print(emp2.address['country']) # 👉️ KeyError: 'country'

该方法的主体在每次调用时都会运行,因此问题不再存在。

解决使用 2 个类时的错误

当实例化时忘记将参数传递给第二个类时,也会发生该错误。

主程序
class Person(): def __init__(self, name): self.name = name class Employee(Person): def __init__(self, name, salary): self.name = name self.salary = salary # ⛔️ TypeError: Person.__init__() missing 1 required positional argument: 'name' Person.__init__(self) def get_name(self): return self.name emp1 = Employee('Bobby', 50) print(emp1)

我们Person在类__init__的方法中实例化了类Employee
,但忘记为参数传递一个值
name

要解决该错误,请name在实例化类时为参数提供一个值。

主程序
class Person(): def __init__(self, name): self.name = name class Employee(Person): # 👇️ removed arg def __init__(self, name, salary): self.name = name self.salary = salary # ✅ passing a value for `name` Person.__init__(self, name) def get_name(self): return self.name emp1 = Employee('Bobby', 50) print(emp1.name) # 👉️ Bobby print(emp1.salary) # 👉️ 50

我们为参数传递了一个值name来解决错误。

您还可以使用该super()方法来实例化父类。

主程序
class Person(): def __init__(self, name): self.name = name class Employee(Person): def __init__(self, name, salary): self.name = name self.salary = salary # ✅ using super() super().__init__(name) def get_name(self): return self.name emp1 = Employee('Bobby', 50) print(emp1.name) # 👉️ Bobby print(emp1.salary) # 👉️ 50

self请注意,我们在使用时没有传递参数super()

super()方法使我们无需显式引用即可访问基类。

我们可以将对的调用替换super()Employee以达到相同的结果。

但是,我们必须
在使用时将
self第一个参数传递给该方法__init__Employee

super()方法比显式引用基类更灵活,更常用。

对父类__init__方法的调用运行该方法并将父类的属性分配给实例。

现在您可以

在子类的实例上
访问父类的属性。

想了解更多关于在 Python 中使用 self 关键字的信息吗? 查看这些资源: Purpose of ‘return self’ from a class method in Python TypeError: missing 1 required positional argument: ‘self’

类型错误:缺少 2 个必需的位置参数 (Python)

Python“TypeError: missing 2 required positional arguments”发生在当我们在调用函数或方法时忘记提供 2 个必需的参数时。

要解决此错误,请在调用函数时指定参数或为参数设置默认值。

typeerror 缺少 2 个必需的位置参数

下面是错误如何发生的示例。

主程序
# 👇️ takes 2 arguments - `a` and `b` def do_math(a, b): return a + b # ⛔️ TypeError: do_math() missing 2 required positional arguments: 'a' and 'b' result = do_math()

do_math函数采用 2 个位置参数 –ab,但我们调用该函数时没有为参数提供值。

为函数调用中的参数提供一个值

解决错误的一种方法是为参数提供一个值。

主程序
def do_math(a, b): return a + b result = do_math(10, 10) print(result) # 👉️ 20

我们将参数值传递给解决错误的函数。

如果我们定义一个接受2参数的函数,我们必须在调用该函数时为参数提供值。

设置函数参数的默认值

另一种解决方案是为函数的参数设置默认值。

主程序
def do_math(a=0, b=0): return a + b result = do_math() print(result) # 👉️ 0

我们将02 个参数设置为默认值。这可以是任何其他值,例如空字符串 ( "") 或者即使None您想不出合适的默认值。

a如果在没有为和参数提供值的情况下调用函数b
,则使用默认值。

参数的硬编码值

如果您只是对这些参数的值进行硬编码,则可以删除参数并在函数体中声明变量。

主程序
def do_math(): a = 100 b = 200 return a + b result = do_math() print(result) # 👉️ 300

a我们硬编码了和的值b

不要为默认参数使用非原始值

一个重要的注意事项是避免为非原始参数设置默认值,例如字典和列表。

这是一个如何出错的示例。

主程序
def get_address(address={}): return address addr1 = get_address() addr2 = get_address() addr1['country'] = 'Germany' print(addr1) # 👉️ {'country': 'Germany'} print(addr2) # 👉️ {'country': 'Germany'}

我们
调用了该get_address()函数 2 次
并将结果存储在变量中。

请注意,我们只country在其中一个词典上设置了键,但它们都得到了更新。

这是因为默认参数只被评估一次——当函数被定义时。

每次调用函数时都不会评估它们。

当像字典或列表这样的非原始默认参数发生变化时,它会为所有函数调用发生变化。

解决此问题的一种方法是将默认参数设置为None并有条件地更新其在函数主体中的值。

主程序
def get_address(address=None): if address is None: address = {} return address addr1 = get_address() addr2 = get_address() addr1['country'] = 'Germany' print(addr1) # 👉️ {'country': 'Germany'} print(addr2) # 👉️ {}

函数体在每次调用时都会运行,所以问题不复存在。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: