Необходимо использовать **kw в другом методе (не __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())

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

Вы ничего не сохраняете в self.kw, вы сохраняете это в self.value, но вы также каждый раз переписываете его, поэтому он будет хранить только последний kw, переданный изначально.

MyNameIsCaleb 27.04.2019 18:46

@NielsHenkens kw является фактическим аргументом, это просто сопоставление параметров переменной длины, передаваемых по имени.

Masklinn 27.04.2019 18:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
161
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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, чтобы он был атрибутом объекта класса.*

Ваш код должен сначала сохранить **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.

*себя

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

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

Другие вопросы по теме