你能在函数中定义_repr__吗?函数是一个类吗?

2024-06-02 06:01:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个名为foo的函数:

def foo():
    return "foo function"

如果看到它返回字符串而不调用函数的事实,则表示__repr__的定义与您在本例中看到的相同:

>>> func
<function func at 0x000001F43B1968B8>
>>> func.__repr__()
'<function func at 0x000001F43B1968B8>'

现在有两个问题向我提出

  1. 函数是类类型吗
  2. 如果是,如何在函数中定义__repr__from

对这两个问题做一点解释:

1: 因为如果你这样做:func.然后在IDE中按ctrl+space,你可以看到类的所有内容,那么我得到的问题是函数不是(简单的)类

2: 我可以这样做吗:

def foo():
    def __repr__():
        return "lol"
    foo.__repr__ = __repr__
    return "foo function"

它在空闲状态下工作,但在调用它之前不会更改__repr__输出,因此可以在调用函数之前更改__repr__


Tags: 函数字符串from类型return定义foodef
2条回答

回答:

回答问题2:不使用def

回答问题1:是的,您可以将函数视为类,因为python是基于类的

option 1(using classes):

因为:

class foo():
    def __init__(self):
        self = "foo"

这是:

class _foo():
    def __init__(self):
        self.foo = "foo"
    def __call__(self):
        return self.foo
foo = _foo()

对于用户而言,与以下内容相同:

def foo():
    return "foo"

因此,如果你真的想拥有一个看起来像函数的东西,但是有一个自定义版本的__repr__,你只需要做如下的事情:

class _foo():
    def __init__(self):
        self.foo = "foo"
    def __repr__(self):
        return "func(foo)"
    def __call__(self):
        return self.foo
foo = _foo()

因为现在如果在中粘贴后在空闲状态下执行foo,您将看到以下输出:


>>> foo
func(foo)
>>> 

using a wrapper class:

在本例中,我使用一个类作为包装器:

class func_wrapper():
    
    def __init__(self,func,repr_msg):
        self.func = func
        self.repr_msg = repr_msg
        
        
        self = repr_msg
        
    def __call__(self,*args,**kwargs):
        return self.func(*args,**kwargs)
    def __repr__(self):
        return self.repr_msg




def repr(msg):
    def dec(fn):
        
        wrapper = func_wrapper(func = fn,repr_msg = msg)
        
        return wrapper
    return dec


@repr("LOL")
def foo():
    return "foo function"

print(foo)
print(foo.__repr__())
print(foo())

它打印出:

LOL
LOL
foo function

解释:

(几乎)python中的所有内容都是一个类尝试使用type(object),您将看到几乎每个“对象”都表示它是一个类

所以我想说的是python几乎是基于类的,它们无处不在,因为如果你试图从非内置的东西中找到一个非类。因为只有一些内置函数不被视为类

概述:

因此,概括一下我的回答:

不,您不能使用def在调用函数之前调用__repr__,但是您可以创建一个看起来像函数的类,并且可以创建一个对用户来说像函数的类

is a function a class type? Yes

print(type(foo))

产生

<class 'function'>

is it possible to change __repr__ before the function has been called?

是,例如使用装饰器:

from functools import wraps


def repr(msg):
    def dec(fn):
        @wraps(fn)
        def new_fn(*args, **kwargs):
            return fn(*args, **kwargs)

        new_fn.__repr__ = lambda: msg
        return new_fn
    return dec


@repr("LOL")
def foo():
    return "foo function"

print(foo)
print(foo.__repr__())
print(foo())

产生

<function foo at 0x7f556d959ef0>
LOL
foo function

相关问题 更多 >