如何检查__str__是否由对象实现

时间:2013-10-28 06:33:24

标签: python

如果对象尚未实现,我想在对象上动态实现__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

解决方案(感谢所有贡献者,总结如下)

  1. 要检查对象上是否实施了__str__,请使用type(obj).__str__ is object.__str__
  2. 要动态添加__str__方法,请使用setattr(obj.__class__, '__str__', lambda x: "New String")

5 个答案:

答案 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')