Необходимо использовать ** кВт в другом методе (не __init__) - PullRequest
1 голос
/ 27 апреля 2019

Итак, у меня есть класс с методом 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())

Возможно, есть другой способ сделать это?Я только начал с ООП ...

Ответы [ 3 ]

2 голосов
/ 27 апреля 2019

Вы можете достичь этого с небольшими изменениями, как указано ниже:

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 голос
/ 27 апреля 2019

**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 имеет тип str (строка).
  • obj1.showdata() уже содержит print внутри, поэтому вам не нужно печатать выходные данные функции, потому что она возвращает None.

* само

Аргумент self в Python ссылается на текущий объект. Он имеет все атрибуты объекта. Вот почему вы можете получить доступ к **kw в другом методе класса. Я рекомендую этот сайт , если вы новичок в ООП в Python.

0 голосов
/ 27 апреля 2019

**kw дает список всех аргументов ключевого слова. Установив переменную self.kw в kw в __init__, вы сможете использовать ключевые слова позже.

И ваш цикл for в __init__ перезаписывает 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)

...