我正在学习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=' ')
答案 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()
。