2013-10-28 26 views
7

我想在对象上动态实现__str__方法(如果对象尚未实现它)。如何检查__str__是否由对象实现

我尝试使用hasattr(obj, '__str__')它总是返回我真实的,因为它从对象类中捡起它。

有没有办法确定一个对象实际上是否实现了__str__

我知道我可以使用inspect.getmembers(obj)但是我正在寻找一个更Python的方式

编辑

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")
+0

我用hasattr为“__str__”但它始终返回true已经尝试过。另一件事是,如果我使用'__eq__'的hasattr,它可以正常工作 – Bhushan

+2

检查'obj .__ str__!= object .__ str__'是否足够? – Gabe

+1

你想让它适用于任何继承的__str__方法吗?如果这个方法不是来自'object',而是继承链上的其他类呢? – reem

回答

9

由于你想要检查的是它是否有一个__str__执行是而不是默认t object.__str__。因此,你可以这样做:

Foo.__str__ is not object.__str__ 

要检查你需要检查的类实例化对象:

​​

如果富不直接实现__str__这也将正常工作,甚至,但继承它来自object,这似乎是你想要的。

+0

也是用'is'代替'=='的好例子。编辑:OP要的东西,根本不寻找继承的方法。 – reem

+1

需要'type(f).__ dict __ ['__ str __']'来规避继承。嗯,呃。 – Eevee

+0

谢谢,完美的作品:) – Bhushan

0

任何从object基地继承的对象将有一个__str__方法,所以测试它是否存在可以忽略不计。

你可以存储对象上的标志属性,并测试该代替:

if not getattr(obj, 'has_str_override_flag'): 
    override_str_here(obj) 
    setattr(obj, 'has_str_override_flag', True)