需要在另一种方法中使用**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)