需要在另一种方法中使用**kw(不是__init__)
Need to use **kw in another method (not __init__)
所以,我有一个 class 和一个 init 方法,其参数为 **kw。
我需要在相同class的另一种方法中使用**kw,但是python return这个错误:
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...
您可以通过如下所述的一些小修改来实现此目的:
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
(即关键字参数)在__init__
函数中保存为局部变量。您需要的是将其保存在 self
参数中作为 class 对象的属性。*
您的代码应首先将 **kw
保存为属性,然后在 class 中的另一个函数(方法)中使用它,因为您传递的是 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语句。
- print("value" + value) 仅当变量
value
的类型为 str
(字符串)时有效。
obj1.showdata()
里面已经有 print
,所以你不必打印函数的输出,因为它 returns None
.
*自己
Python中的self
参数指的是当前对象。它具有对象的所有属性。这就是为什么您可以在 class 的另一种方法中访问 **kw
的原因。如果您是 Python 中的 OOP 新手,我推荐 this website。
**kw
为您提供所有关键字参数的列表。通过在 __init__
中将变量 self.kw
设置为 kw
您可以稍后使用关键字。
并且您在 __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)
所以,我有一个 class 和一个 init 方法,其参数为 **kw。 我需要在相同class的另一种方法中使用**kw,但是python return这个错误: 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...
您可以通过如下所述的一些小修改来实现此目的:
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
(即关键字参数)在__init__
函数中保存为局部变量。您需要的是将其保存在 self
参数中作为 class 对象的属性。*
您的代码应首先将 **kw
保存为属性,然后在 class 中的另一个函数(方法)中使用它,因为您传递的是 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语句。 - print("value" + value) 仅当变量
value
的类型为str
(字符串)时有效。 obj1.showdata()
里面已经有print
,所以你不必打印函数的输出,因为它 returnsNone
.
*自己
Python中的self
参数指的是当前对象。它具有对象的所有属性。这就是为什么您可以在 class 的另一种方法中访问 **kw
的原因。如果您是 Python 中的 OOP 新手,我推荐 this website。
**kw
为您提供所有关键字参数的列表。通过在 __init__
中将变量 self.kw
设置为 kw
您可以稍后使用关键字。
并且您在 __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)