说我有这样的功能
def spam():
spam.eggs = "Foobar"
#do stuff
return
我希望在另一个函数中获取spam.eggs
("Foobar"
)的值,而无需实际调用spam()
方法,例如,
def main():
print spam.eggs
我希望它返回Foobar
。然而,显然,这不起作用,因为我还没有调用spam(),所以我从未分配spam.eggs
属性,所以我必须这样做
def main():
spam()
print spam.eggs
但是,如果我想要spam()
属性,我不想调用eggs
函数,事实上,我想检查spam()
是否具有eggs属性,以及是否在调用之前它等于"Foobar"
,例如
def main():
if hasattr(spam,'eggs'):
if getattr(spam, 'eggs') == "Foobar":
spam()
但和以前一样,因为我还没有打电话给spam
我还没有分配spam.eggs
。
有没有办法做到这一点,也许有装饰师?我想保持赋值有点接近函数,所以我更喜欢不像
的东西def func():
setattr(spam, 'eggs', 'Foobar')
除非在装饰器中,否则我必须在另一种方法中执行setattr()
。
答案 0 :(得分:3)
可以用装饰器完成,是的:
def addEggs(func):
func.eggs = "foobar"
return func
@addEggs
def spam():
pass
>>> spam.eggs
'foobar'
如果您希望能够以参数化方式指定属性名称和/或值,则必须编写更复杂的装饰器:
def addAttr(attr, value):
def deco(func):
setattr(func, attr, value)
return func
return deco
@addAttr('attrName', 'value')
def spam():
pass
>>> spam.attrName
'value'
然而,仍然存在为什么要这样做的问题。如果函数属性完全有用,那通常是因为有一个自然的位置来设置它们 - 也就是说,其他东西为了它自己的目的而在函数上设置属性。如果你只是在定义函数时设置属性 - 也就是说,如果属性是函数本身的固有部分 - 看起来你可能想要更像是带有方法的类。< / p>
答案 1 :(得分:1)
我认为你真的想要一个带静态字段的类。因为变量是函数的本地变量,所以它们无法以你想要的方式访问它们
class Spam:
eggs="foobar"
def __init__(self,*args,**kwargs):
# do some stuff
Spam.eggs = "foobared"
print Spam.eggs
Spam()
print Spam.eggs
答案 2 :(得分:1)
您将获得带有spam.eggs的属性简单明了。顺便说一下,您不必在函数内部分配属性。你可以做到
def spam():
#do stuff
return
spam.eggs = "Foobar"
然后spam.eggs和spam()将完全相同