用Python装饰类,该Python打印装饰类的int变量
我正在学习python课程,其中一个练习是为这个类创建一个decorator,它返回每个int变量`用Python装饰类,该Python打印装饰类的int变量,python,python-decorators,Python,Python Decorators,我正在学习python课程,其中一个练习是为这个类创建一个decorator,它返回每个int变量` @decoratoreDiClasse class MyClass: def __init__(self): self.a = 1 self.b = 2 self.c = 'w'` 我的问题是列表总是空的,因为dict不返回init中的变量,我如何解决我的问题? 我已经把我的装饰师写在下面了 def decoratoreDiClasse(
@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
这是main中应该打印变量的部分,由于老师的要求,除了“decorediclass”之外,我不能更改任何内容
for v in x.elencaVariabili():
print(v, end=' ')
看起来您应该让装饰器向类中添加一个方法,该方法在调用它的实例上打印出整数值属性。这不是您当前试图做的,因为您的代码尝试在类上而不是稍后在实例上查找变量 将您所做的作为一种方法,它会简单得多:
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()
看起来您应该让装饰器向类中添加一个方法,该方法在调用它的实例上打印出整数值属性。这不是您当前试图做的,因为您的代码尝试在类上而不是稍后在实例上查找变量
将您所做的作为一种方法,它会简单得多:
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()
提示:lista1=cls.\uu dict\uu
将没有任何实例属性,你关心的是什么…你的提示是关于“cls”还是dict?提示是关于使用cls
的属性。类名称空间不包含实例属性,它们包含类属性。您需要一个实例作为实例属性。提示:lista1=cls.\uuu dict\uuu
将没有任何实例属性,这是您关心的…您的提示是关于“cls”还是dict?提示是关于使用cls
的\uu dict\uu
属性。类名称空间不包含实例属性,它们包含类属性。对于实例属性,您需要一个实例。