为什么Python不会在命名空间冲突时引发错误?

Cha*_*l72 2 python namespaces python-3.x

以下Python代码正常执行而不引发异常:

class Foo:
    pass

class Foo:
    pass

def bar():
    pass

def bar():
    pass

print(Foo.__module__ + Foo.__name__)
Run Code Online (Sandbox Code Playgroud)

但显然,有多个实例__main__.Foo__main__.bar.为什么Python遇到此命名空间冲突时不会引发错误?而且由于它没有引发错误,它到底在做什么?第一类是否被第二类__main__.Foo取代__main__.Foo

Rom*_*huk 6

在Python中,一切都是对象 - 某种类型的实例.Eg 1是一个类型的实例int,def foo(): pass创建一个对象foo,它是一个类型的实例function(对于类 - 对象,由classstatement 创建的对象是类型的实例type).鉴于此,之间没有区别(在名称绑定机制的级别)

class Foo:
  string = "foo1"

class Foo:
  string = "foo2"
Run Code Online (Sandbox Code Playgroud)

a = 1
a = 2
Run Code Online (Sandbox Code Playgroud)

顺便说一句,类定义可以使用type函数执行(是的,有类型type和内置函数type):

Foo = type('Foo', (), {string: 'foo1'})
Run Code Online (Sandbox Code Playgroud)

因此,类和函数不是一些不同类型的数据,尽管可以使用特殊语法来创建它们的实例.

另请参阅相关数据模型部分.