普通功能中的"自我"?

mpe*_*pen 7 python

我有一堆函数(在任何类之外),我在其上设置了属性,比如funcname.fields = 'xxx'.我希望我可以从函数内部访问这些变量self.fields,但当然它告诉我:

全局名称'self'未定义

那么......我该怎么办?我可以访问一些神奇的变量吗?喜欢__this__.fields


有几个人问过"为什么?".您可能不同意我的推理,但我有一组函数,所有函数都必须共享相同的签名(只接受一个参数).在大多数情况下,这一个参数足以进行所需的计算.但是,在一些有限的情况下,需要一些额外的信息.我决定只在功能上设置它们,以便很容易被忽略,而不是强迫每个函数接受一长串未使用的变量.

虽然,现在我发现**kwargs如果你不关心额外的args ,你可以使用它作为最后一个参数.那好吧...

编辑:实际上,我没有写的一些功能,宁愿不修改接受额外的args.通过"传入"额外的args作为属性,我的代码可以使用我的自定义函数,利用额外的args,以及不需要额外args的第三方代码.

谢谢你的快速答案:)

Gor*_*son 11

self不是python中的关键字,它只是一个普通的变量名.在创建实例方法时,您可以根据需要命名第一个参数,self只是一个约定.

您应该总是更喜欢将参数传递给函数而不是设置输入属性,但如果必须,您可以使用实际函数名来访问其中的变量:

def a:
    if a.foo:
        #blah

a.foo = false
a()
Run Code Online (Sandbox Code Playgroud)

看看python函数属性 -当它派上用场时使用和滥用.:d


Nas*_*nov 2

您无法在所有情况下都正确地执行“函数访问其自身属性” - 有关详细信息,请参阅此处如何 python 函数访问其自身属性?- 但这里有一个快速演示:

>>> def f(): return f.x
... 
>>> f.x = 7
>>> f()
7
>>> g = f
>>> g()
7
>>> del f
>>> g()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 1, in f
NameError: global name 'f' is not defined
Run Code Online (Sandbox Code Playgroud)

基本上大多数方法直接或间接依赖于通过全局变量中的名称查找来访问函数对象;如果删除原始函数名称,则该函数将停止工作。还有其他笨拙的方法可以实现此目的,例如定义类或工厂 - 但由于您的解释,很明显您并不真正需要它们。

只需执行提到的关键字包罗万象的参数,如下所示:

def fn1(oneArg):
    // do the due

def fn2(oneArg, **kw):
    if 'option1' in kw:
        print 'called with option1=', kw['option1']
    //do the rest

fn2(42)
fn2(42, option1='something')
Run Code Online (Sandbox Code Playgroud)

不确定您在处理 TypeError 的评论中的意思是什么 - 使用 **kw 时不会出现这种情况。这种方法对于某些 python 系统函数非常有效 - 检查 min()、max()、sort()。最近sorted(dct,key=dct.get,reverse=True)在 CodeGolf 挑战赛中对我来说非常方便:)