当我导入一个模块,比如sys时,我假设我正在导入一个脚本,为了访问它的功能,我必须使用点表示法。 例如,我想写一些东西到控制台:
sys.stderr.write("Error")
在这里,我访问stderr"功能?"从模块sys,但然后我访问其write属性,这也是一个函数?我如何知道stderr是否是一个子类化sys的类,或者它是否是一个函数?
非常感谢。
答案 0 :(得分:3)
导入模块后(如sys
或其他任何东西),点符号可能会引用它包含的任何内容。你也可以导入一个'包'包含模块,类,类中的方法,模块中的函数等。
>>> import sys
>>> type(sys)
<class 'module'>
>>> sys.stderr
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp437'>
>>> type(sys.stderr)
<class '_io.TextIOWrapper'>
>>> type(sys.stderr.write)
<class 'builtin_function_or_method'>
>>>
它意味着是通用的属性排序访问,其中另一个内容通过点访问,就像它是该对象的属性一样。
我认为这是不明确的,因此模块/包的用户不需要关心这些对象的实现细节。如果它们发生变化,只要维护结构和名称,它引用的实际对象就不会引起用户的关注。他们总是可以使用type()
或help()
查看详细信息或使用其他内省工具。
答案 1 :(得分:0)
点是一个通用的元素引用,而不仅仅是一个函数。这表示获取stderr
的{{1}}元素,然后获取sys
的{{1}}元素。为此,write
必须是包含元素的对象,stderr
必须是函数...因为括号表示我们正在尝试调用stderr
。
我们必须知道每个元素的一般语义:哪些是包,它们是常量,它们是函数等。