python3在函数名称上定义__repr__

时间:2019-01-06 21:13:26

标签: python python-3.x function

道歉:这个问题还不清楚。我希望以更清晰的形式重写它。参见https://stackoverflow.com/questions/54066737。我确实想删除此问题,但是系统建议我不要删除。

我正在努力在课堂上定义__repr__()。我有一个类成员self.lbl,它可以是空字符串”,也可以是一个字符串'a'或函数名。我失败的代码是

def __repr__(self):
    lbl = self.lbl
    if isinstance(lbl,str) and len(lbl) <= 1:
        out = "'" + lbl + "'" 
    elif type(lbl).__name__ == 'function':
        out = repr(lbl.__name__)
    return out

假设f是定义的函数,我写x=f。然后,我想从f中提取信息MyClass(x)print(MyClass(x))应该只给我f,而不是'f'

2 个答案:

答案 0 :(得分:1)

strlambda之类的类型已经拥有自己的__repr__。只是使用那个。请注意,eval(repr(obj))创建原始对象是一种建议,而不是必要。

示例(Python 3.6 +):

>>> class MyClass:
...     def __init__(self,lbl):
...         self.lbl = lbl
...     def __repr__(self):
...         return f'MyClass(lbl={self.lbl!r})'
...
>>> MyClass('')
MyClass(lbl='')
>>> MyClass('a')
MyClass(lbl='a')
>>> MyClass(lambda x: x * 2)
MyClass(lbl=<function <lambda> at 0x000001E0E288E730>)

答案 1 :(得分:1)

也许你的意思是这样的:

class MyClass:
    def __init__(self, lbl):
        self.lbl = lbl

    def __repr__(self):
        lbl = self.lbl
        if callable(lbl):
            lbl = lbl.__name__
        else:
            lbl = repr(lbl)
        return f"MyClass({lbl})"

如果经过以下测试:

def foo():
    return bar

print(MyClass('a'))
print(MyClass(lambda x: x * 2))
print(MyClass(foo))

它给出:

MyClass('a')
MyClass(<lambda>)
MyClass(foo)