![](/img/trans.png)
[英]How do I use **kwargs in Python 3 class __init__ function?
[英]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__()
本身中,您显然需要参数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,这很好,但如果是这样的话,一个不同的例子会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.