使用Python装饰一个类,该类打印装饰后的类的int变量

时间:2020-03-31 18:29:45

标签: python python-decorators

我正在学习python课程,练习之一是为此类创建一个装饰器,该装饰器返回每个int变量。

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

我的问题是列表始终为空,因为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 个答案:

答案 0 :(得分:2)

您似乎应该让您的装饰器向该类添加一个方法,该方法可在其调用的实例上打印出整数值的属性。这不是您当前要执行的操作,因为您的代码会尝试在类中 而不是稍后在实例上找到变量。

考虑一下您作为一种方法正在做的事情,它将变得更加简单:

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