如何在python的_init__;()构造函数中传递**kwargs?
我正试图编写一个程序,在该程序中,我试图通过init()方法中的**kwargs。之后 当我试图在构造函数(init()方法)中生成实例变量时,我无法生成。我该怎么做 这是我的密码:如何在python的_init__;()构造函数中传递**kwargs?,python,python-3.x,Python,Python 3.x,我正试图编写一个程序,在该程序中,我试图通过init()方法中的**kwargs。之后 当我试图在构造函数(init()方法)中生成实例变量时,我无法生成。我该怎么做 这是我的密码: class Student: def __init__(self,**kwargs): self.name = name self.age = age self.salary = salary def show_name(self):
class Student:
def __init__(self,**kwargs):
self.name = name
self.age = age
self.salary = salary
def show_name(self):
print("Name is : " + self.name)
def show_age(self):
print("Age is : " + str(self.age))
def show_salary(self):
print(f"Salary of {self.name} is : " + str(self.salary))
st = Student('John',25,15000)
st2 = Student('Doe',25,1500000)
st.show_salary()
st2.show_salary()
**kwargs
要求参数按关键字传递,而不是按位置传递。完成此操作后,您可以像在任何其他词典中一样访问各个Kwarg:
class Student:
def __init__(self, **kwargs):
self.name = kwargs.get('name')
self.age = kwargs.get('age')
self.salary = kwargs.get('salary')
def show_name(self):
print("Name is : " + self.name)
def show_age(self):
print("Age is : " + str(self.age))
def show_salary(self):
print(f"Salary of {self.name} is : " + str(self.salary))
st = Student(name='John', age=25, salary=15000)
st2 = Student(name='Doe', age=25, salary=1500000)
st.show_salary()
st2.show_salary()
如果要按位置传递这些参数,则应改用
*args
。kwargs作为函数范围内的字典创建。您需要传递一个关键字,该关键字将它们用作字典中的关键字。(尝试运行下面的打印语句)
虽然您可以像这里的一些答案所显示的那样做到这一点,但这并不是一个好主意(至少对于您在这里显示的代码来说不是)。因此,我不打算回答您提出的主题行问题,而是向您展示您似乎正试图编写的代码应该在做什么(这不是使用
kwargs
)。在很多地方,使用kwargs是解决编码问题的最佳方法,但类的构造函数通常不是其中之一。这是在试图教书,而不是说教。我只是不希望其他人以后再出现,看到这个问题并认为这是一个好主意
类的构造函数\uuuu init\uuuu()
,通常应该定义它需要并期望设置类的参数。您不太可能真的希望它使用任意字典作为其参数列表。在构造函数中,这实际上是您想要的,这是相对少见的,特别是当没有涉及继承时,这可能表明您出于某种原因不知道参数是什么
在\uuuu init\uuuu()
本身中,您显然需要参数name
、age
和salary
,但是如果参数列表中没有这些参数,则调用者不清楚您是否需要这些参数。而且,您对它的使用似乎并不意味着您希望使用它。你这样称呼它:
st = Student('John',25,15000)
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.salary = salary
def __init__(self, name=None, age=None, salary=None):
self.name = name
self.age = age
self.salary = salary
因此,您甚至不需要命名参数
要处理所显示的调用结构,\uuuu init\uuuu()
如下所示:
st = Student('John',25,15000)
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.salary = salary
def __init__(self, name=None, age=None, salary=None):
self.name = name
self.age = age
self.salary = salary
如果您希望能够在不使用某些参数的情况下调用它,以便它对遗漏的参数使用默认值,那么应该如下所示:
st = Student('John',25,15000)
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.salary = salary
def __init__(self, name=None, age=None, salary=None):
self.name = name
self.age = age
self.salary = salary
kwargs方法似乎不太可能是您真正想要的,尽管很明显,您可以按照其他答案所示的方式对其进行编码
也许你只是想知道如何使用kwargs,这很好,但如果是这样的话,另一个例子会更好。
Student(name='John',weight=300,height=150000)
你的意思是self.name=kwargs[“name”]
等等?代码本身会导致错误,并且没有真正意义。对于*args会发生什么?如果其中一个kwargs没有通过,会不会发生此错误?会的。使用kwargs.get(“”)避免keyerrorYes,如果关键字未传递,它将提示KeyError
。您可以使用get()来克服这个问题。因此,您可以使用self.name=kwargs.get('name')
而不是self.name=kwargs[“name”]
。另外,如果你能接受一个答案,无论是我的答案还是水鬼的答案,那就太好了。我认为答案是等价的。对于*args,它向我显示了类型错误:元组索引必须是整数或切片,而不是策略。它的行为将不同于kwargs
。创建的是元组,而不是字典。因此,您可以执行self.name=args[0]
等操作,而不是self.name=args[“name”]
。如果是*args
而不是关键字,则必须使用索引。