2017-03-20 74 views
2

有沒有辦法改變CLASS OBJECT以便type(object)報告一個自定義的字符串?一種重寫'type()'報告的方法

class MyClass(object): 
    def __init__(self, t): 
     if 'detector' in t: 
      my_type_string = "I am set as a detector." 
     else: 
      my_type_string = "I am set as a broadcaster." 

>>> o = MyClass('detector') 
>>> type(o) 
I am set as a detector. 
+5

'型(..)'不會**返回一個字符串... –

回答

6

你不應該那樣做。相反,你應該實現兩個獨立的類,這兩個從MyClass繼承:

class MyClass(object): 
    my_type_string = "I am not set to anything." 

    def __str__(self): 
     return self.my_type_string 

class Detector(MyClass): 
    my_type_string = "I am set as a detector." 

class Broadcaster(MyClass): 
    my_type_string = "I am set as a broadcaster." 

>>> o = Detector() 
>>> type(o) 
__main__.Detector 
>>> str(o) 
'I am set as a detector.' 

如果你想這取決於你提供,你可以實現一個工廠,返回所需對象的字符串類切換:

def factory(t): 
    if 'detector' in t: 
     return Detector() 
    else: 
     return Broadcaster() 

>>> o = factory('detector') 
>>> type(o) 
__main__.Detector 
1

你可以,但它是危險的。 type是一個內建的,其他地方可以使用它。但是,如果您知道自己在做什麼以及爲什麼這麼做,則可以重新定義type。但是這裏是龍。你已被警告。

class MyClass(object): 
    def __init__(self, t): 
     if 'detector' in t: 
      self.my_type_string = "I am set as a detector." 
     else: 
      self.my_type_string = "I am set as a broadcaster." 

def type(obj): 
    return obj.my_type_string if isinstance(obj, MyClass) else __builtins__.type(obj) 

但恕我直言,你不應該用於該用途使用內置type名字,但創建一個特定的功能:

def my_type(obj): 
    return obj.my_type_string if hasattr(obj, 'my_type_string') else str(type(obj)) 

,因爲現在它可以始終返回一個字符串

+0

不應該是'obj.my_type_string'嗎? – rassar

+0

@rassar:當然應該!感謝您注意... –

+2

重新定義'type'並不是一個好主意,我很驚訝地看到一個50k +的代表甚至暗示這一點。 -1。 – wim