【问题标题】:can you define __repr__ in a function and is a function a class?您可以在函数中定义 __repr__ 并且函数是类吗?
【发布时间】:2020-05-06 06:10:03
【问题描述】:

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

def foo():
    return "foo function"

如果看到它甚至没有调用函数就返回一个字符串,这意味着__repr__ 的定义就像你在这个例子中看到的那样:

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

所以现在有 2 个问题浮现在我的脑海中

  1. 函数是类类型吗?
  2. 如果是这样,我如何在函数中定义__repr__

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

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

2: 我可以这样做吗:

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

它在 IDLE 中工作,但在您调用它之前它不会更改 __repr__ 输出,所以可以在调用函数之前更改 __repr__ 吗?

【问题讨论】:

  • 你把类和实例搞混了。大多数你认为函数是类的证据实际上是因为函数是类的实例(这并不特殊,因为每个对象都是 Python 中的类的实例)。

标签: python python-3.x function repr


【解决方案1】:

函数是类类型吗? 是的

print(type(foo))

生产

<class 'function'>

是否可以在调用函数之前更改__repr__

是的,例如使用装饰器:

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

【讨论】:

    【解决方案2】:

    答案:

    回答问题 2:不,不使用 def

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

    选项 1(使用类):

    因为这个:

    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()
    

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

    
    >>> foo
    func(foo)
    >>> 
    

    使用包装类:

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

    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__,但是您可以创建一个看起来像函数的类,并且在那里您可以创建一个对用户来说就像一个类功能

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2014-01-17
      • 2020-08-24
      • 2011-06-02
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      相关资源
      最近更新 更多