Python: self.__ class__ vs. type (self)

我在想

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

还有

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

有什么理由选择其中一个吗?

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

54614 次浏览

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

实际上在 Python 中这并不罕见,考虑一下 repr(x),它只调用 x.__repr__()len(x),它只调用 x.__len__()。Python 更喜欢将内置函数用于可能在一系列类中使用的常见函数,并且通常通过调用 __x__()方法来实现这些函数。

>>> class Test(object): pass
>>> t = Test()
>>> type(t) is t.__class__
True
>>> type(t)
__main__.Test

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

然而,type(t)不适用于旧式类,因为旧式类的实例类型是 instance,而新式类的实例类型是它的类:

>>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance