Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不调用函数的情况下获取函数的属性_Python_Python 2.7_Attr - Fatal编程技术网

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

Python 如何在不调用函数的情况下获取函数的属性,python,python-2.7,attr,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(

假设我有这样一个函数

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
但是,如果我想要
eggs
属性,我不想调用
spam()
函数,事实上,我想在调用它之前检查
spam()
是否具有eggs属性,以及它是否等于
“Foobar”

def main():
    if hasattr(spam,'eggs'):
        if getattr(spam, 'eggs') == "Foobar":
            spam()
但是像以前一样,因为我没有调用
spam
,所以我还没有分配
spam.egs

有没有办法做到这一点,也许可以找个装饰师?我想让赋值稍微接近函数,所以我更喜欢与函数不同的赋值

def func():
    setattr(spam, 'eggs', 'Foobar')

我必须用另一种方法执行
setattr()
,除非是在装饰器中

我认为您实际上想要一个带有静态字段的类。由于变量是函数的局部变量,因此无法按您希望的方式访问它们

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

print Spam.eggs
Spam()
print Spam.eggs

我认为您实际上需要一个具有静态字段的类。由于变量是函数的局部变量,因此无法按您希望的方式访问它们

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

print Spam.eggs
Spam()
print Spam.eggs

可以由一个装饰师来完成,是的:

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'

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

可以使用装饰器来完成,是的:

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'

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

您将使用spam.egs获得属性。简单明了。顺便说一句,您不必在函数内部分配属性。你可以

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

然后spam.eggs和spam()的工作原理将完全相同

您将获得spam.eggs的简单属性。顺便说一句,您不必在函数内部分配属性。你可以

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

然后spam.eggs和spam()将完全相同

这对我来说太抽象了。(我假设我不是唯一一个想到“你为什么要这么做?”)的人。如果你能告诉我们你到底在做什么,我们也许能建议一个更优雅的选择。。。如果没有,知道您正在处理一个真正的问题总是会让人更有动力。我有一个带有函数的模块,我正在尝试用xmlrpc动态注册,比如
server.register\u function(function,function.attr)
,其中属性是RPC方法名这对我来说太抽象了。(我假设我不是唯一一个想到“你为什么要这么做?”)的人。如果你能告诉我们你到底在做什么,我们也许能建议一个更优雅的选择。。。如果没有,知道您正在处理一个真正的问题总是会让人更有动力。我有一个模块,带有函数,我正在尝试使用xmlrpc动态注册,比如
server.register\u function(function,function.attr)
,其中属性是RPC方法名我想要检查函数是否具有特定属性,如果它匹配,如果匹配,则调用它,而不是创建一个类。我想检查一个函数是否有某个属性,如果匹配,则调用它,而不是创建一个类。@JoranBeasley--是的,这是一个真正的装饰器(而不是传统的装饰器,我更倾向于将其视为转换)。但问题仍然是“为什么?”。您可以执行
def spam():pass;spam.eggs='foobar'
我更喜欢这个解决方案,而不是
def spam():pass;spam.eggs='foobar'
,因为它看起来更漂亮,也给了我更多的控制,即使它看起来不是很“pythonic”,但是,我不知道你可以在函数之外设置属性。@JoranBeasley--是的,这是一个真正的装饰器(而不是传统的装饰器,我更倾向于将其视为转换). 但问题仍然是“为什么?”。您可以执行
def spam():pass;spam.eggs='foobar'
我更喜欢这个解决方案,而不是
def spam():pass;spam.eggs='foobar'
,因为它看起来更漂亮,而且也给了我更多的控制,即使它看起来不是很“pythonic”,但是,我不知道您可以在函数的正外部设置属性。