Python 一种覆盖';类型()';报告

Python 一种覆盖';类型()';报告,python,string,class,casting,repr,Python,String,Class,Casting,Repr,是否有方法更改类对象,以便类型(对象)报告自定义字符串 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 =

是否有方法更改类对象,以便
类型(对象)
报告自定义字符串

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.

你不应该那样做。相反,您应该实现两个独立的类,它们都继承自
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

你可以,但这很危险<代码>类型是内置的,其他地方也可以使用它。但是,如果您知道自己在做什么以及为什么要这样做,您可以重新定义
类型
。但是这里有龙。您已收到警告。:

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)
但是,无论如何,您不应该使用内置的
类型
名称,而应该创建一个特定的函数:

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

因为现在它可以始终如一地返回字符串

类型(..)
不返回字符串…它不应该是
对象吗?我的类型字符串
?重新定义
类型
不是一个好主意,我很惊讶看到一个超过50k的代表用户甚至建议这样做1.@wim这是可能的,语言允许。我先说它很危险,然后我又补充说你不应该使用内置名称
type
。我不知道什么是OP要求(即使我永远不会这么做…),所以,没有必要提及它。有时你必须看到问题背后的问题。@wim:这就是我建议使用另一个名称的原因。但事实是,像Python这样的动态语言允许内置的重新定义。它甚至是一个强大的语言特性,比如元类和装饰器,都允许特殊的行为。无论如何,我同意这里不应该使用它。