如果对象尚未实现,我想在对象上动态实现__str__
方法。
我尝试使用hasattr(obj, '__str__')
它总是返回我,因为它从对象类中提取它。
有没有办法确定某个对象是否实际实现了__str__
?
我知道我可以使用inspect.getmembers(obj)
,但我正在寻找一种更加pythonic的方式
修改
class Employee(object):
def __init__(self, name, age, emp_code):
self.name = name
self.age = age
self.emp_code = emp_code
测试
e = Employee("A", 23, "E1")
print hasattr(e, '__str__')
>> True
我希望hasattr返回False,因为Employee类没有实现str
解决方案(感谢所有贡献者,总结如下)
__str__
,请使用type(obj).__str__ is object.__str__
__str__
方法,请使用setattr(obj.__class__, '__str__', lambda x: "New String")
答案 0 :(得分:10)
由于您要检查的是它是否具有不的__str__
实现,因此默认为object.__str__
。因此,您可以这样做:
Foo.__str__ is not object.__str__
要检查实例化对象,您需要检查类:
type(f).__str__ is not object.__str__
即使Foo没有直接实现__str__
,但是从object
以外的其他类继承它,这也是有效的。这似乎是你想要的。
答案 1 :(得分:0)
从object
基础继承的任何对象都将使用__str__
方法,因此测试它是否存在可以忽略不计。
您可以在对象上存储一个标志属性,然后测试它:
if not getattr(obj, 'has_str_override_flag'):
override_str_here(obj)
setattr(obj, 'has_str_override_flag', True)
答案 2 :(得分:0)
在你的对象中,有__dict__包含对象拥有的所有方法和变量。您可以检查给定对象是否具有
实现的__str __()方法'__str__' in Employee.__dict__
或
'__str__' in vars(Employee)
vars()和__dict__之间没有区别,只是vars()更像Pythonic。
答案 3 :(得分:0)
事实证明,内置类型依赖object.__str__
进行(智能)格式化。我真的只想消除像<__main__.Foo object at 0x10299d390>
这样的无用字符串,并且仍然可以正确打印dict和其他类型。我的解决方案:
objre = re.compile(r"<.* object at 0x[0-9a-f]+>")
if objre.fullmatch(str(obj)):
# Do smarter formatting
这不会捕获模块,函数等的默认格式,可以通过inspect.getsource()
来显示其默认源代码,但是无论如何我都不会在变量检查器中显示它们。
答案 4 :(得分:0)
如果使用type(e)时在类中不存在method_name,请使用type(e).__ dict __。get(method_name)避免KeyError。__dict __ [method_name]
e = Employee("A", 23, "E1")
if type(e).__dict__.get('__str__'):
print('__str__ implemented')
else:
print('__str__ not implemented')