6

python内置方法是否可以在某个包中引用?

让我解释。在我使用 python 的早期 (ier) 日子里,我制作了一个类似于此的 django 模型:

class MyModel(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    property = models.ForeignKey("Property")

从那以后,我需要向它添加一个属性。这给我留下了这个模型:

class MyModel(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    property = models.ForeignKey("Property")

    @property
    def name(self):
        return "{} {}".format(first_name, last_name)

所以现在在运行时我得到错误:TypeError: 'ForeignKey' object is not callable. 发生这种情况是因为属性的 ForeignKey 已替换内置标识符属性。我希望能够做的是,而不是@property使用@sys.property(或类似的东西)。

注意:我已经知道将 name 属性移到属性字段声明上方的解决方法。我不太关心这种特殊情况,因为我是引用 python 内置程序的替代位置的主要问题。

4

2 回答 2

15

使用builtins,或者__builtin__如果您使用的是 Python 2。

def open():
    pass

import __builtin__

print open
print __builtin__.open

这给了你:

<function open at 0x011E8670>
<built-in function open>
于 2011-01-04T22:18:06.507 回答
2

Python 有一个builtins模块,其中存储了“真正全局”的东西——通常只是标准的内置函数和类型——存储。在 Python 2 中,它被命名为__builtin__,但工作方式基本相同。

这个模块可以像任何其他模块一样被导入——但它也神奇地为每个其他模块提供了内置名称(不会隐藏它们)。


如果您想知道它是如何工作的,builtins文档会说:

作为实现细节,大多数模块都将名称__builtins__作为其全局变量的一部分提供。的值__builtins__通常是此模块或此模块__dict__属性的值。由于这是一个实现细节,因此 Python 的替代实现可能不会使用它。

exec说:

如果globals字典不包含 key 的值,则在该 key 下插入__builtins__对内置模块字典的引用。builtins这样,您可以通过将自己的__builtins__字典插入到全局变量中,然后再将其传递给exec().

所以,至少在 CPython 中,当你评估 时abs,它在 中查找,在 中globals()['abs']找不到,然后在globals()['__builtins__'].__dict__['abs'].

并且每当 Python(或者至少是 CPython)创建一个新的模块对象时,它的代码都会针对带有 a 的 a 执行globalsempty __builtins__这意味着默认的builtins模块值会被填充,这样就可以工作了。这globals是为模块中定义的非常函数和类(以及您明确执行的任何操作而globals无需显式替换__builtins__)复制的那个,因此它也适用于函数和类。

于 2018-04-02T07:07:02.427 回答