2017-03-20 123 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