Итак, у меня есть класс с методом в этом, аргументом которого является **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())
Может быть, есть другой способ сделать это? Я только начал с ООП...
@NielsHenkens kw является фактическим аргументом, это просто сопоставление параметров переменной длины, передаваемых по имени.






Вы можете добиться этого с небольшой модификацией, как указано ниже:
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.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)
Вы ничего не сохраняете в
self.kw, вы сохраняете это вself.value, но вы также каждый раз переписываете его, поэтому он будет хранить только последнийkw, переданный изначально.