2

我是 Python 新手,但已经多次阅读 Python 中的一切都是对象的原则。

这是否意味着一切都是某个类的实例?

例如,假设我们有一个函数f。然后请考虑运行以下命令。

def f(x):
    return x

print(type(f))

我明白了<class 'function'>。这是否意味着某处有一个名为function的类f是一个实例?g = function(some argument here)那么是否可以使用我自己定义的类来创建一个函数function

4

2 回答 2

2

是的,在 Python 3 中,一切都是object某个类的一个实例。我们可以用 明确地检查这一点isinstance

def f(x):
    return x

print(isinstance(f, object)) # True

有趣的是,该名称function没有在内置函数中定义,但我们可以很好地使用它,正如您已经确定的那样,通过说

function = type(f)

值得注意的是,内置函数和(绑定)方法的类型与常规函数不同。

class A:
  def foo(self):
    pass

print(type(f))      # <class 'function'>
print(type(abs))    # <class 'builtin_function_or_method'>
print(type(A.foo)   # <class 'function'>
print(type(A().foo) # <class 'method'>

我们可以使用help(function)(其中function定义如上)来获取有关构造函数的更多信息。

class function(object)
 |  function(code, globals, name=None, argdefs=None, closure=None)
 |  
 |  Create a function object.
 |  
 |  code
 |    a code object
 |  globals
 |    the globals dictionary
 |  name
 |    a string that overrides the name from the code object
 |  argdefs
 |    a tuple that specifies the default argument values
 |  closure
 |    a tuple that supplies the bindings for free variables
 |  
 |  Methods defined here:
 |  
 |  __call__(self, /, *args, **kwargs)
 |      Call self as a function.
 |  
 |  __get__(self, instance, owner, /)
 |      Return an attribute of instance, which is of type owner.
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __annotations__
 |  
 |  __closure__
 |  
 |  __code__
 |  
 |  __defaults__
 |  
 |  __dict__
 |  
 |  __globals__
 |  
 |  __kwdefaults__

正如评论中已经指出的那样,实际上调用这个庞然大物是不平凡的,我无法立即在 Python 的网站上找到任何关于如何这样做的好的文档。

于 2020-12-28T07:49:21.720 回答
1

您可以使用def关键字创建函数实例。
它是一些泛型类的子类function。您可以将其与一些需要实现该__call__方法的虚拟类进行比较。
使用该__call__方法,您可以将任何对象用作函数:

class Hello:
    def __call__(self, name):
        print(f'Hello {name}')

h = Hello()
print(h('Cabbage')) # -> 'Hello Cabbage'
于 2020-12-28T07:47:46.663 回答