我注意到一些函数,例如sorted
,可以在不指定它们所属的实例的情况下调用 - 就像我在自己的类中定义的函数f
一样,并且不需要指定我从我的类中调用它们。
这些功能属于哪里,这种层次结构如何工作?
在Python中,一切都是对象。但是您不需要为所有内容指定类。一些对象的语言核心中的类型(类)是硬定义的 - 就像函数,整数,浮点数,列表,字典,字符串等一样。
因此,无论您是在模块内定义函数还是使用来自某些第三方软件包或内置模块的本机函数,函数的类型都是“FunctionType” - 它永远不需要显式声明。
与您的疑问更相关:函数不需要与任何类相关 - 它们本身就是对象,并且在名称调用后添加可选括号括号中的可选参数列表的语法。
所以就像C,Javascript等...你可以在Python中创建非常复杂的程序,从不定义类。
另一方面,在类体内定义的函数在通过该类的实例(或者如果它们是类方法时通过类)检索时用作方法。那就是Python 3 - Python 2会更复杂:通过类本身检索的类体内定义的函数是“非绑定方法” - 另一种对象类型。
最后,它是Python中一个名为__builtins__
的特殊模块,它由Python运行时本身填充。您尝试在代码段中使用的任何名称都将被检查为以下上下文之一:本地上下文,非本地(嵌套函数的外部闭包),全局(变量,模块级别定义的函数和类)或内置(它)存在于__builtins__
模块中)。
在__builtins__
中定义了一些函数和几个类,它们允许编写相当完整的Python代码而无需任何导入:
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
因此,您在Python模块中键入的内容是一个语句,上面的名称之一,或者必须在以某种形式使用之前声明(使用=
语句,或者使用import
,或者甚至是def
声明)。
作为最后的建议,因为你正在学习Python,你可能在Python 2中没有遗留代码库:你应该学习Python 3.它使很多东西变得简单,并且包含了超过9年的Python创新2,将在2年后停止维持。