所以,我有一个带有init方法的类,其参数为** kw。我需要在同一个类的另一个方法中使用** kw,但python返回此错误:AttributeError:'MyClass'对象没有属性'kw'
class MyClass:
def __init__(self, **kw):
if kw is not None:
for value in kw.items():
self.value = value
def showdata(self):
if self.kw is not None:
for value in self.kw.items():
print("value: " + value)
obj1 = MyClass(A = 237, B = 83, C = 182218)
print(obj1.showdata())
也许有另一种方法可以做到这一点?我刚刚开始使用OOP ......
**kw
(即关键字参数)在__init__
函数中保存为局部变量。你需要的是将它保存在self
参数中作为类对象的属性。*
您的代码应首先将**kw
保存为属性,然后在类中的另一个函数(方法)中使用它,因为您传递的是self
参数。
class MyClass:
def __init__(self, **kw):
self.kw = kw
def showdata(self):
if self.kw:
for key, value in self.kw.items():
print(key, ":", value)
obj1 = MyClass(A = 237, B = 83, C = 182218)
obj1.showdata()
此代码打印:
A : 237
B : 83
C : 182218
if self.kw
。如果它为空,则不会通过if语句。value
的类型为str
(string)时有效。obj1.showdata()
里面已经有print
,所以你不必打印函数的输出,因为它返回None
。Python中的self
参数指的是当前对象。它具有对象的所有属性。这就是为什么你可以在类的另一种方法中访问**kw
。如果你不熟悉Python中的OOP,我推荐使用this website。
您可以通过下面所述的一些修改来实现此目的:
class MyClass:
def __init__(self, **kw):
self.kw = kw
def showdata(self):
if self.kw is not None:
for key,value in self.kw.items():
print(f'Key = {key} , Value = {value}')
obj1 = MyClass(A = 237, B = 83, C = 182218)
obj1.showdata()
**kw
为您提供所有关键字参数的列表。通过在self.kw
you中将变量kw
设置为__init__
,可以稍后使用关键字。
而你在__init__
的for-loop正在为每个值覆盖self.value
。要解决这个问题,你可以使self.value成为一个列表并将所有值附加到它:
class MyClass:
def __init__(self, **kw):
self.kw = kw # this sets the attribute kw of self to kw.
if kw is not None:
self.values = []
for value in kw.items():
self.values.append(value)
def showdata(self):
if values is not None:
for value in values:
print("value: " + value)
obj1 = MyClass(A = 237, B = 83, C = 182218)
print(obj1.showdata())
因此您不使用关键字的名称,您可以将**kw
更改为*args
并将self.values
设置为args
:
def __init__(self, *args):
self.values = values # this does the same thing as the code above but with much less code
如果您打算使用这种方法,您应该将obj1 = MyClass(A = 237, B = 83, C = 182218)
更改为obj1 = MyClass(237, 83, 182218)