因此,我有一个带有 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 ...
答案 0 :(得分:2)
您可以进行一些小的修改,如下所述:
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()
答案 1 :(得分:1)
**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
(字符串)时有效。obj1.showdata()
中已经包含print
,因此您不必打印函数的输出,因为它返回了None
。 Python中的self
参数引用当前对象。它具有对象的所有属性。这就是为什么您可以在该类的另一种方法中访问**kw
的原因。如果您不熟悉Python中的OOP,我建议this website。
答案 2 :(得分:0)
**kw
为您提供所有关键字参数的列表。通过在self.kw
中将变量kw
设置为__init__
,可以稍后使用这些关键字。
您在__init__
中的for循环将为每个值覆盖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)