Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python的_init__;()构造函数中传递**kwargs?_Python_Python 3.x - Fatal编程技术网

如何在python的_init__;()构造函数中传递**kwargs?

如何在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):

我正试图编写一个程序,在该程序中,我试图通过init()方法中的**kwargs。之后 当我试图在构造函数(init()方法)中生成实例变量时,我无法生成。我该怎么做

这是我的密码:

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
而不是关键字,则必须使用索引。