Python:self.__class__和type(self)

Python: self.__class__ vs. type(self)

本问题已经有最佳答案,请猛点这里访问。

我想知道两者之间是否有区别

1
2
3
class Test(object):
    def __init__(self):
        print self.__class__.__name__

1
2
3
class Test(object):
    def __init__(self):
        print type(self).__name__

有没有理由选择其中一个呢?

(在我的用例中,我想用它来确定记录器的名称,但我想这并不重要)


1
2
3
4
5
6
>>> class Test(object): pass
>>> t = Test()
>>> type(t) is t.__class__
True
>>> type(t)
__main__.Test

所以这两个是一样的。我会使用self.__class__,因为它更明显是什么。

但是,由于旧样式类的实例类型为instance,而新样式类实例的类型为其类,因此type(t)不适用于旧样式类:

1
2
3
4
5
6
>>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance


据我所知,后者只是做前者的更好方式。

这在python中实际上并不少见,比如repr(x),它只是调用x.__repr__()len(x),它只是调用x.__len__()。python更喜欢为您可能在一系列类中使用的公共函数使用内置函数,并且通常通过调用__x__()方法来实现这些函数。