如何在不调用函数的情况下获取函数的属性

时间:2013-04-09 20:22:03

标签: python python-2.7 attr

说我有这样的功能

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

3 个答案:

答案 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()将完全相同