Получаю ошибку "'dict_values' object is not callable" хотя аргумент который принимает метод.setter только **Kwargs

bion74

Новичок
Пользователь
Ноя 7, 2021
1
0
1
Челябинск
Библиотеки не использую
Версия Win10
Версия Python 3.9

Доброго всем суток
Познаю еще азы питона , возник вопрос. почему возникает данна ошибка "'dict_values' object is not callable"?

Есть код

class Persons:
def __init__(self,**kwargs):
self.__persons={}
for i in kwargs:
self.__persons=kwargs.split()
@property
def Person(self):
return self.__persons.values()

@Person.setter
def Person(self,**persons):
print('Ok')

p=Persons(oleg='Oleg Frolov 62', lolita='Lolita Vasnecova 45')
p.Person (выводит dict_values([['Oleg', 'Frolov', '62'], ['Lolita', 'Vasnecova', '45']]))
p.Person(Kiril='Kiril Frolov 66', lida='lida Vasnecova 44') ---- вот на этой строк собственно и выходит данная ошибка


при этом , если сделать обычную функцию
def Person(**persons):
for i in persons:
print(f'{i} > {persons}')
a=Person(Kiril='Kiril Frolov 66')

# вывод "Kiril > Kiril Frolov 66"


Кто то может объяснить в чем проблема Person.setter , при этом со всеми остальными типами данных проблем нет (проверял строки , числа и листы)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
во первых, код вставляйте как код, соблюдая отступы, подробнее тут как задать вопрос
во вторых, ваш код у меня не заработал, так как у словаря нет метода split()...
в третьих, имена функций принято писать с маленькой буквы, а имена классов - с большой...

а так да, не работает...
я такого не встречал, и не использовал нигде, но похоже, судя по тому что я нашел, property не поддерживают аргументы с ключевыми словами, если я не прав, меня поправят...

как альтернатива, можно написать так
Python:
class Persons:
    def __init__(self, **kwargs):
        self.__persons = kwargs

    @property
    def person(self):
        return self.__persons

    @person.setter
    def person(self, persons):
        self.__persons = persons
        print(self.__persons)


p = Persons(oleg='Oleg Frolov 62', lolita='Lolita Vasnecova 45')
print(p.person)
p.person = {"Kiril": "Kiril Frolov 66", "lida": "lida Vasnecova 44"}

или не использовать property
Python:
class Persons:
    def __init__(self, **kwargs):
        self.__persons = kwargs

    # @property
    def person(self):
        return self.__persons

    # @person.setter
    def person_setter(self, **persons):
        self.__persons = persons
        print(self.__persons)


p = Persons(oleg='Oleg Frolov 62', lolita='Lolita Vasnecova 45')
print(p.person())
p.person_setter(Kiril='Kiril Frolov 66', lida='lida Vasnecova 44')
 

Форум IT Специалистов