77

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

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

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

?

有理由选择其中一个吗?

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

4

2 回答 2

51
>>> 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
于 2012-04-30T15:26:26.550 回答
6

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

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

于 2012-04-30T15:26:23.733 回答