如何在Python的__init__()构造函数中传递**kwargs?
我正在尝试写一个程序,想在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 个回答
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()
虽然这里有一些回答展示了你可以这样做,但其实这并不是个好主意(至少对于你展示的这段代码来说)。所以我不会直接回答你在标题里问的问题,而是想告诉你,你似乎想写的代码应该是怎样的(而且不应该使用 kwargs
)。在很多情况下,使用 kwargs
是解决编码问题的最佳方案,但在类的构造函数中,通常不是这样。我想传达的是教学,而不是说教。我只是希望其他人看到这个问题时,不会觉得这是构造函数的好主意。
你类的构造函数 __init__()
通常应该定义它需要和期望的参数,以便正确设置类。你不太可能真的希望它接受一个任意的字典作为参数列表。实际上,在构造函数中,这种情况是相对少见的,特别是当没有继承关系时,这可能会让人觉得你不知道参数的具体用途。
在你的 __init__()
中,你显然需要 name
、age
和 salary
这几个参数,但如果它们不在参数列表中,调用者就不清楚你需要这些参数。而且,你的调用方式似乎也没有表明你是这样期望使用它的。你是这样调用的:
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
,这没问题,但如果是这样的话,换一个例子会更好。
**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
。