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

0 投票
3 回答
6433 浏览
提问于 2025-06-18 04:00

我正在尝试写一个程序,想在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()

相关问题:

  • 暂无相关问题
暂无标签

3 个回答

0

kwargs 是在函数内部创建的一个字典。你需要传递一个关键词,这个关键词会作为字典中的键。(试着运行下面的打印语句)

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

虽然这里有一些回答展示了你可以这样做,但其实这并不是个好主意(至少对于你展示的这段代码来说)。所以我不会直接回答你在标题里问的问题,而是想告诉你,你似乎想写的代码应该是怎样的(而且不应该使用 kwargs)。在很多情况下,使用 kwargs 是解决编码问题的最佳方案,但在类的构造函数中,通常不是这样。我想传达的是教学,而不是说教。我只是希望其他人看到这个问题时,不会觉得这是构造函数的好主意。

你类的构造函数 __init__() 通常应该定义它需要和期望的参数,以便正确设置类。你不太可能真的希望它接受一个任意的字典作为参数列表。实际上,在构造函数中,这种情况是相对少见的,特别是当没有继承关系时,这可能会让人觉得你不知道参数的具体用途。

在你的 __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,这没问题,但如果是这样的话,换一个例子会更好。

4

**kwargs 是用来接收通过关键字传递的参数,而不是按顺序传递的。当你这样做时,你可以像访问其他字典一样访问每个单独的 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()

如果你想按顺序传递这些参数,应该使用 *args

撰写回答