1

说我有这样的功能

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()除非在装饰器中,否则我必须使用另一种方法。

4

3 回答 3

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'

但是,仍然存在您为什么要这样做的问题。如果函数属性完全有用,那通常是因为有一个自然的地方来设置它们——也就是说,其他东西为了自己的目的设置函数的属性。如果您只是在定义函数时正确设置属性 --- 也就是说,如果属性是函数本身的固有部分 --- 似乎您可能想要更像带有方法的类的东西。

于 2013-04-09T20:25:31.057 回答
1

我认为您实际上想要一个带有静态字段的类。由于变量对于声明它们的函数是本地的,因此无法以您想要的方式访问它们

class Spam:
     eggs="foobar"
     def __init__(self,*args,**kwargs):
         # do some stuff
         Spam.eggs = "foobared"

print Spam.eggs
Spam()
print Spam.eggs
于 2013-04-09T20:23:43.487 回答
1

你会得到 spam.eggs 简单明了的属性。顺便说一句,您不必在函数内部来分配属性。你可以做

def spam():
    #do stuff
    return
spam.eggs = "Foobar"

然后 spam.eggs 和 spam() 将完全一样

于 2013-04-09T20:37:18.243 回答