Python函数可以从作用域外被赋予新的属性吗?

标签 python attributes namespaces scope

我不知道你可以这样做:

def tom():
    print "tom's locals: ", locals()

def dick(z):
    print "z.__name__ = ", z.__name__
    z.guest = "Harry"
    print "z.guest = ", z.guest
    print "dick's locals: ", locals()

tom()              #>>> tom's locals:  {}
#print tom.guest    #AttributeError: 'function' object has no attribute 'guest'
print "tom's dir:", dir(tom)  # no 'guest' entry

dick( tom)         #>>> z.__name__ =  tom
                   #>>> z.guest =  Harry
                   #>>> dick's locals:  {'z': <function tom at 0x02819F30>}
tom()              #>>> tom's locals:  {}
#print dick.guest  #AttributeError: 'function' object has no attribute 'guest'

print tom.guest    #>>> Harry
print "tom's dir:", dir(tom)  # 'guest' entry appears

函数 tom() 没有局部变量。函数 dick() 知道 tom() 住在哪里,并将 Harry 作为“客人”安置在 tom() 的地方。 harry 在 tom() 的地方不是本地人,但如果你问 tom 的客人,harry 会回答。 harry 是 tom() 的新属性。

更新:从 tom() 外部,您可以说“print dir(tom)”并查看 tom 对象的字典。 (您也可以从 inside tom() 执行此操作。这样 tom 可以发现他有一个新房客 harry,他的名字是“客人”。)

那么,属性可以从函数外部添加到函数的命名空间吗?经常这样做吗?这是可以接受的做法吗?在某些情况下是否推荐?它有时真的很重要吗? (它是 Pythonic 的吗?)

更新:标题现在说“属性”;它曾经说“变量”。这是一个 PEP about Function Attributes .

最佳答案

我认为您可能混淆了局部变量函数属性 的概念。有关 Python 函数属性的更多信息,请参阅 SO 问题 Python function attributes - uses and abuses .

关于Python函数可以从作用域外被赋予新的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753232/

相关文章:

python - 具有灵活聚合周期的按 pandas 分组的数据帧的平均值

python - 一维卷积神经网络输入形状 `ValueError`

c++ - clang::acquire_capability 的用例是什么?

python - 使用 Python 将一个文本文件逐行复制到另一个文本文件

python - 当两个 python mod 都需要不同的 python 版本时如何使用它们

oop - 类属性声明: private vs public

html - 在悬停时删除标题工具提示,但不在 HTML 中

c# - 使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间

php命名空间自动加载目录

php - 用于 PHP 最小示例的 Facebook SDK v4