如何在Python对象中覆盖__type__方法?

5
我创建了一个用于数学计算的Python类。在这个对象中,我试图更改type()方法的结果,但是我的尝试失败了。
当我尝试使用type()方法来查看我的对象时,它显示为: <class '__main__.MyClassName'> 我在我的方法中重写了type方法:
class MyMathOBJ():
.   
.
.
    def __type__(self):
        return "MyMathOBJ"

但是当我这样做时,没有任何改变。结果还是一样的。我只是期望得到MyMathOBJ这个结果。


2
你不能覆盖这个,type 应该返回 类型对象,即类对象,一开始就是这样的,所以即使这是可能的,返回一个字符串也会是一个错误的实现。这听起来像是一个 X-Y 问题,你实际上想做什么? - juanpa.arrivillaga
我正在尝试使用MyMathOBJ更改<class '__main__.MyClassName'>的结果。例如,a = 5;print(type(a))代码将打印出int。只是这样。没有混淆的东西。我只想要它。 - munir.aygun
只是它看起来更好 :) 美观和好奇心。 - munir.aygun
2
我很感兴趣看看你是否能够伪造type的结果;不一定要将其更改为字符串,而是完全更改它。 - flakes
1
@juanpa.arrivillaga 哦,你说得对,但这现在会导致 test 方法对于 foo 实例重定向到 Bar(我已经在 gist 中更新了它)。我将发布一个新问题来探讨黑魔法元类方法,这激起了我的好奇心! :) - flakes
显示剩余8条评论
1个回答

9
你似乎基本上误解了 type 的作用。 type 本身只是一个类,也是一个元类。当你在实例上调用 type 时,它返回与该实例对应的类对象,几乎相当于 instance.__class__。但是,你只是想要改变类对象在打印时的表示方式,因此需要为 MyMathOBJ 实现一个元类来重写元类中的 __repr__
以下是实现你想要做的内容的方法:
In [12]: class PrettyType(type):
    ...:     def __repr__(self):
    ...:         return self.__name__
    ...:

In [13]: class MyMathOBJ(metaclass=PrettyType):
    ...:     pass
    ...:

In [14]: obj = MyMathOBJ()

In [15]: obj
Out[15]: <MyMathOBJ at 0x1060cbcc0>

In [16]: type(obj)
Out[16]: MyMathOBJ

1
请注意,您可以替换 x.__class__,但这不会改变 type(x) - o11c
1
__repr__中,参数名应该叫做cls而不是self,因为它在一个元类中,并且实例是类。 - Blckknght
也许可以通过添加一个简短的段落来明确说明语言中没有__type__特殊方法,并附上一个链接到数据模型,其中描述了大多数特殊下划线方法来改进这个问题。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接