Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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 3.x - Fatal编程技术网

Python—动态地向函数添加变量。为什么这是可能的?

Python—动态地向函数添加变量。为什么这是可能的?,python,python-3.x,Python,Python 3.x,我是一名Java程序员,正在进入Python,有些事情令人困惑。例如,动态地向函数添加变量。例如: def main(): print ("Hello World") main.temp = 50 print (main.temp) 这到底是什么意思?为什么要向函数中添加变量?为什么允许这样做?为什么我可以通过main.temp引用函数?Python中的函数是一流的对象,这意味着你可以用它们做任何你想做的事情。见鬼,你甚至可以这样做: def foo(): pass foo.i

我是一名Java程序员,正在进入Python,有些事情令人困惑。例如,动态地向函数添加变量。例如:

def main():
    print ("Hello World")


main.temp = 50

print (main.temp)

这到底是什么意思?为什么要向函数中添加变量?为什么允许这样做?为什么我可以通过main.temp引用函数?

Python中的函数是一流的对象,这意味着你可以用它们做任何你想做的事情。见鬼,你甚至可以这样做:

def foo(): pass

foo.inner_foo = lambda: print('inner foo')

foo.inner_foo()
# inner foo
是的,它是一个具有属性的函数,属性是一个函数。是的,我们可以更深入:

def foo(): pass

foo.inner_foo = lambda: None

foo.inner_foo.inner_inner_foo = lambda: print('inner inner foo')

foo.inner_foo.inner_inner_foo()
# inner inner foo

是的,我们可以更深入,但你会明白…

好吧,python中的所有东西都是对象,甚至函数。@ng.newbie为什么禁止它?能够用任意属性对函数进行注释实际上是非常有用的,并且确实被一些著名的框架所使用。FWIW,我非常喜欢函数属性,但我承认它们并不流行,通常有更好的方法可以使用函数属性来做事情。但我认为,它们是一种方便的方法,可以将数据附加到函数,而且比在全局空间中漂浮一个本应与函数关联的游离对象要好。Django templates为防止从模板调用某些方法,Django admin为计算的listview字段提供有意义的完整标签,我知道我在其他框架中见过它,但不记得是哪种ATM,我个人在至少十几个项目中使用过它,原因类似:向函数添加元数据,以便其他代码可以对这些函数进行特殊处理。标准Python通常被称为CPython,因为解释器是用C编写的,它定义的内置类型是使用C结构定义的。也可以用C语言编写自己的Python扩展,尽管这不是普通人经常做的事情;但是看看标准列表对象的C源代码。这什么时候有用?为什么允许此功能?仅仅因为函数是对象,你就不应该被允许向它添加变量。Django广泛使用了这一点。仅仅因为您没有立即看到该实用程序并不意味着它一文不值。@ng.newbie仅仅因为函数是对象,您不应该被允许向其添加变量。为什么?这几乎是第一类对象的字面定义。是的,这非常有用,请参阅链接重复问题的答案。@Java中的DeepSpace对象不允许在创建后添加变量。这就是我为什么这么说的原因。Python中对象的定义不同吗?@James你能举个例子说明Django是如何使用它的吗?也许如果我看到了一个真实生活中的授权使用,那么也许这个功能会让我少烦恼一点。