Украсьте класс с помощью Python, который печатает переменные int декорированного класса. - PullRequest
0 голосов
/ 31 марта 2020

Я учусь на курсе python, и одним из упражнений было создание декоратора для этого класса, который возвращает все переменные типа int. `

@decoratoreDiClasse
class MyClass:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 'w'`

Моя проблема в том, что список всегда empty beacuse dict не возвращает переменные внутри init, как я могу решить мою проблему? я написал свой декоратор ниже

def decoratoreDiClasse(cls):
def elencaVariabili():

    lista = []
    print(cls)
    lista1 = cls.__dict__
    print(lista1)

    for ab in lista1:

        if isinstance(ab, int):
            lista.append(ab)
    return lista

setattr(cls, "elencaVariabili", elencaVariabili())
return cls

вот часть основного, которая должна печатать переменные, я не могу ничего изменить, кроме "decoratoreDiClasse" из-за запроса учителя.

    for v in x.elencaVariabili():
    print(v, end=' ')

1 Ответ

2 голосов
/ 31 марта 2020

Похоже, что ваш декоратор должен добавить метод в класс, который печатает целочисленные атрибуты в экземпляре, к которому он обращен. Это не то, что вы сейчас пытаетесь сделать, поскольку ваш код пытается найти переменные в классе , а не в экземпляре позже.

Думайте о том, что вы делаете, как метод, и это будет намного проще:

def decoratoreDiClasse(cls):
    def elencaVariabili(self):     # this is a method, so it should take self!
        lista = [value for value in self.__dict__.values()  # loop over our attribute values
                       if isinstance(value, int)]           # and pick out the integers!
        return lista

    setattr(cls, "elencaVariabili", elencaVariabili)  # don't call the method here
    return cls

Из вашего кода не совсем понятно, должны ли вы возвращать имена целочисленных переменных или только сами значения. Я использовал только значения, но если вам нужны имена переменных, вам, возможно, придется изменить понимание списка, чтобы перебирать items() словаря экземпляра, а не только values().

...