2017-03-20 5 views
2

type(object)がカスタム文字列を報告するようにCLASS 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

'タイプを返すことができますので、

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

を(..) 'does not **は文字列を返します** –

答えて

6

あなたはそうしてはいけません。代わりに、あなたはMyClassから継承どちらも2つの別々のクラス、実装する必要があります。

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名前を使用しますが、特定の機能作成しないでください。今、それは一貫した文字列

+0

' obj.my_type_string'ではありませんか? – rassar

+0

@rassar:もちろんそれはすべきです!気づいてくれてありがとう... –

+2

'type'を再定義するのは良い考えではありません。私は50k + repのユーザーがそれを示唆しているのを見て驚いています。 -1。 – wim

関連する問題