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

'형식을 반환 할 수 있기 때문에 (..)'** 문자열을 반환하지 않습니다 ... –

답변

6

그렇게해서는 안됩니다.

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

을 그리고 당신은 당신의 클래스를 사용하면 원하는 개체를 반환하는 공장 구현할 수 제공하는 문자열에 따라 전환 할 경우 :

을 대신 당신은 MyClass에서 상속 둘 다 두 개의 클래스를 구현해야합니다
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) 

그러나 IMHO, 당신은 그 사용을 위해 내장 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 + rep 사용자가이를 제안하는 것을보고 놀랐습니다. -1. – wim

관련 문제