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

时间:2012-04-30 15:22:50

标签: python

我想知道

之间是否存在差异
class Test(object):
    def __init__(self):
        print self.__class__.__name__

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

有理由偏好其中一个吗?

(在我的用例中我想用它来确定记录器名称,但我想这没关系)

2 个答案:

答案 0 :(得分:38)

>>> 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

答案 1 :(得分:5)

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

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