编辑: 我不认为这是Python中什么是元类的真实副本?,即使在长评论的结尾部分回答了我的问题。
链接的问题通常针对元类。我的问题是关于特定的元类的type。而且据我所知,阅读答案后,type无法在纯Python中实现元类。因此,我的问题不仅是关于“什么是元类?”,而且还涉及type/ object关系以及元类如何创建自身,这是通过在实现级别上“作弊”来实现的。
对于不熟悉元类概念的人来说,这两个问题似乎完全无关。
初始帖子:
我对Python 3中的object和type类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。
每个类(除外object)都从称为的基类继承object。但是每个类(包括object)也是该类的type一个实例,它是自身的实例,object并且也从继承object。
是否有一个原因/设计决定,为什么object是的实例type并type从中继承object?type对象的/ class 是否也可以是对象本身?
类(type)如何成为其自身的实例?
哪一个是真正的基类object或type?
我一直认为object这将是最“基础”的类,但它似乎是的实例type,这是的实例object,是的实例type,...递归在哪里结束?
是否有可能说明object和type类之间的关系?
我查找了Python标准库文档中的object和的条目type …
在我的 Anaconda Python3.7 安装中导入 PyGObject 时,
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
ValueError: Namespace Gtk not available
Run Code Online (Sandbox Code Playgroud)
我从 conda-forge 频道安装了 pygobject 和 gobject-introspection。
当我使用Python的系统安装时,它工作得很好。
给定一个包:
package/
??? __init__.py
??? module.py
Run Code Online (Sandbox Code Playgroud)
__init__.py:
from .module import function
Run Code Online (Sandbox Code Playgroud)
模块.py:
def function():
pass
Run Code Online (Sandbox Code Playgroud)
可以导入包并打印其命名空间。
python -c 'import package; print(dir(package))'
Run Code Online (Sandbox Code Playgroud)
['__builtins__', ..., 'function', 'module']
Run Code Online (Sandbox Code Playgroud)
题:
为什么仅在导入时package包含的命名空间?modulefunction__init__.py
我原以为package的命名空间将只包含function而不是module. 文档中也提到了这种机制,
“当使用任何机制(例如 importlib API、import 或 import-from 语句或内置
__import__())加载子模块时,将在父模块的命名空间中放置到子模块对象的绑定。”
但并没有真正的动机。对我来说,这个选择似乎很奇怪,因为我认为子模块是结构包的实现细节,并且不希望它们成为 API 的一部分,因为结构可以改变。
我也知道“Python 是为了成年人的同意”,并且不能真正向用户隐藏任何东西。但我会争辩说,将子模块名称绑定到包的范围会使用户不太清楚什么是 API 的实际组成部分以及什么可以更改。
为什么不使用__sub_modules__属性等来使用户可以访问子模块?这个设计决定的原因是什么?