2013-10-28 64 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)