需要在另一种方法中使用** kw(不是__init__)

时间:2019-04-27 16:39:49

标签: python python-3.x self kwargs

因此,我有一个带有 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 ...

3 个答案:

答案 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语句。
  • print(“ value” + value)仅在变量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)