道歉:这个问题还不清楚。我希望以更清晰的形式重写它。参见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'
答案 0 :(得分:1)
str
和lambda
之类的类型已经拥有自己的__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)