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

在python中向函数追加属性

在python中向函数追加属性,python,python-3.x,function,Python,Python 3.x,Function,我不确定这到底是什么意思,也不知道它是如何使用的,但当涉及到一个函数时,我遇到了这个功能。我能够动态地向函数添加属性。有人能帮我理解这有什么用,它是怎么发生的吗?我的意思是它毕竟是一个函数名,我们如何动态地向它添加属性呢 def impossible(): print "Adding a bool" impossible.enabled = True # i was able to just do this. And this is a function, how does this

我不确定这到底是什么意思,也不知道它是如何使用的,但当涉及到一个函数时,我遇到了这个功能。我能够动态地向函数添加属性。有人能帮我理解这有什么用,它是怎么发生的吗?我的意思是它毕竟是一个函数名,我们如何动态地向它添加属性呢

def impossible():
    print "Adding a bool"

impossible.enabled = True 
# i was able to just do this. And this is a function, how does this add up?

print(impossible.enabled) # No attribute error. o/p --> True

名称
不可能
指向表示函数的对象。您正在为此对象设置属性(python允许您在默认情况下对所有对象执行此操作):

由于此对象实现了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

>>> class B:
...   def __call__(self, **kw):
...     print(kw)
...
>>> b = B()
>>> b()    
{}
>>> b(foo='bar')
{'foo': 'bar'}
>>> def bar():
...   print("ost")
...
>>> dir(bar)
['__call__', ..., 'func_closure', ...] 
如果您创建一个新函数,您可以看到您没有对函数(其类)的定义做任何修改,只是对表示原始函数的对象做了修改:

>>> class B:
...   def __call__(self, **kw):
...     print(kw)
...
>>> b = B()
>>> b()    
{}
>>> b(foo='bar')
{'foo': 'bar'}
>>> def bar():
...   print("ost")
...
>>> dir(bar)
['__call__', ..., 'func_closure', ...] 

此新对象没有名为
a
的属性,因为您没有在对象
栏上设置指向的属性。

在python中,函数是对象,它们具有各种内部属性,也可以具有
\udit\ud
属性,与任何其他对象一样,
\uuu dict\uuu
中的任何内容都是该对象的变量。如果在
之前和之后打印它,则可以看到它。已启用

def impossible():
    print "Adding a bool"

print(impossible.__dict__) #  {}
impossible.enabled = True 
print(impossible.__dict__) #  {'enabled': True}
这不会以任何方式更改函数,因为大部分时间
\uuuuu dict\uuuu
都是空的,并且函数中没有特殊值。
事实上,它有点有用,因为您可以在函数中使用它来存储静态变量,而不会弄乱全局名称。例如,您可以使用函数属性来实现一个简单的计数器,如下所示:

def count():
    try:
        count.counter += 1
    except AttributeError:
        count.counter = 1
    return count.counter

重复调用“count()”会产生:1,2,3,…

它不是一个函数名;这是一个函数,和其他值一样。任何类型都可以允许或禁止新属性。这同样适用于类吗?与哪个相同?=)类也和其他任何值一样,也是一种允许新属性的类型,是的。类不是函数(请尝试
isinstance(SomeClass,type(some_function))
)。是否有方法打印函数的定义,如果这样做,我是否可以看到附加到函数上的新属性?但函数上的属性无论如何都不是函数定义的一部分。您可以使用
dir(不可能)
查看其上所有属性的名称。randomName='Jack'#这是一个对象吗?(如在randomName中)没有字符串、数字、布尔值和None是基本体,而不是objects@AntiMatterDynamite:这是Python。是的,字符串、数字、布尔值和
None
都是对象,它们只是不可变的。(
isinstance(True,object)
)@Abhishek:它是一个object。Python中的每个值都是一个对象。那么为什么我们不能向string对象添加属性呢?如randomName.Enabled=True