目录
TypeError: __init__() missing 1 required positional argument
TypeError: _ _ init _ _ () 缺少 1 个必需的位置参数
Python“TypeError: _ init _ _ () missing 1 required positional argument”发生在我们在实例化一个类时忘记提供一个必需的参数。
要解决该错误,请在实例化类时指定参数或为参数设置默认值。
下面是错误如何发生的示例。
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__
方法的调用运行该方法并将父类的属性分配给实例。
现在您可以
在子类的实例上访问父类的属性。
类型错误:缺少 2 个必需的位置参数 (Python)
Python“TypeError: missing 2 required positional arguments”发生在当我们在调用函数或方法时忘记提供 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 个位置参数 –a
和b
,但我们调用该函数时没有为参数提供值。
为函数调用中的参数提供一个值
解决错误的一种方法是为参数提供一个值。
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
我们将0
2 个参数设置为默认值。这可以是任何其他值,例如空字符串 ( ""
) 或者即使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) # 👉️ {}
函数体在每次调用时都会运行,所以问题不复存在。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: