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

问题描述 投票:1回答:3

所以,我有一个带有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 ......

python python-3.x self kwargs
3个回答
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

A few extra points:

  • 对于字典,你可以使用if self.kw。如果它为空,则不会通过if语句。
  • print(“value”+ value)仅在变量value的类型为str(string)时有效。
  • obj1.showdata()里面已经有print,所以你不必打印函数的输出,因为它返回None

*self

Python中的self参数指的是当前对象。它具有对象的所有属性。这就是为什么你可以在类的另一种方法中访问**kw。如果你不熟悉Python中的OOP,我推荐使用this website


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()

0
投票

**kw为您提供所有关键字参数的列表。通过在self.kwyou中将变量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)

© www.soinside.com 2019 - 2024. All rights reserved.