繁体   English   中英

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

[英]How can I pass **kwargs in __init__() constructor in python?

我正在尝试编写一个程序,我试图在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预计 arguments 将通过关键字而不是 position 传递。 一旦你这样做了,你就可以像在任何其他字典中一样访问各个 kwargs:

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()

如果你想通过 position 传递这些 arguments,你应该使用*args代替。

kwargs在 function 的 scope 中创建为字典。 您需要传递一个关键字,将它们用作字典中的键。 (尝试运行下面的打印语句)

class Student:
    def __init__(self, **kwargs):
        #print(kwargs)
        self.name = kwargs["name"]
        self.age = kwargs["age"]
        self.salary = kwargs["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()

尽管您可以按照此处的某些答案所示来执行此操作,但这并不是一个好主意(至少对于您在此处显示的代码而言)。 因此,我不会回答您提出的主题行问题,而是向您展示您似乎正在尝试编写的代码应该做什么(并且不使用kwargs )。 有很多地方使用 kwargs 是编码问题的最佳解决方案,但 class 的构造函数通常不是其中之一。 这是试图教导,而不是说教。 我只是不希望其他人稍后出现,看到这个问题并认为这对于构造函数来说是个好主意。

class 的构造函数__init__()通常应该定义它需要和期望设置 class 的参数。 您不太可能真的希望它采用任意字典作为其参数列表。 这实际上是您在构造函数中想要的相对较少,特别是当没有涉及 inheritance 时,这可能表明您由于某种原因不知道参数是什么。

在您的__init__()本身中,您显然需要参数nameagesalary ,但是在参数列表中没有它们,调用者并不清楚您这样做。 此外,您对它的使用似乎并不意味着您期望使用它。 你这样称呼它:

st = Student('John',25,15000)

因此,您甚至似乎都不想要命名参数。

要处理您展示的调用结构, __init__()将如下所示:

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,这很好,但如果是这样的话,一个不同的例子会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM