2017-03-20 6 views
2

Gibt es eine Möglichkeit, ein CLASS OBJECT so zu ändern, dass type(object) eine benutzerdefinierte Zeichenfolge meldet?Eine Möglichkeit, die 'type()' - Berichte zu überschreiben

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

'Typ zurückgeben (..) 'does ** not ** gibt einen String zurück ... –

Antwort

6

Sie sollten das nicht tun. Stattdessen sollten Sie zwei getrennte Klassen implementieren, die beide von MyClass erben:

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.' 

Und wenn Sie Ihre Klasse auf einer Schnur je wechseln möchten Sie Sie bieten könnte eine Fabrik implementieren, die das gewünschte Objekt zurückgibt:

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

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

Sie können, aber es ist gefährlich. type ist ein Built-in, und andere Orte könnten es verwenden. Aber wenn Sie wissen, was Sie tun und warum Sie es tun, können Sie type neu definieren. aber Hier sind Drachen. Du wurdest gewarnt.:

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) 

Aber IMHO, sollten Sie nicht die builtin type Namen für diese Verwendung, verwenden aber eine bestimmte Funktion erstellen:

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

denn jetzt kann es konsequent eine Zeichenfolge

+0

Sollte es nicht' obj.my_type_string' sein? – rassar

+0

@rassar: Natürlich sollte es! Danke für's Bemerken ... –

+2

"Typ" neu zu definieren ist keine gute Idee, und ich bin überrascht zu sehen, dass ein 50k + rep Benutzer das sogar vorschlägt. -1. – wim

Verwandte Themen