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

Mar*_*lze 61 python

我想知道两者之间是否存在差异

class Test(object):
    def __init__(self):
        print self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

class Test(object):
    def __init__(self):
        print type(self).__name__
Run Code Online (Sandbox Code Playgroud)

是否有理由偏好其中一个?

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

Thi*_*ter 39

>>> class Test(object): pass
>>> t = Test()
>>> type(t) is t.__class__
True
>>> type(t)
__main__.Test
Run Code Online (Sandbox Code Playgroud)

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

但是,type(t)对于旧式类不起作用,因为旧式类的实例instance的类型是新类型实例的类型是它的类:

>>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance
Run Code Online (Sandbox Code Playgroud)

  • 真?你可以通过`type(self)`访问`self .__ class__`吗?我认为后者更清晰,打字更少,更一致 - 我怀疑你做的是[1,2,3] .__ len __()`而不是`len([1,2,3])`. (14认同)
  • 好吧`len()`告诉你它做了什么 - 但是`type(self)`并没有马上告诉你"给你上课" (13认同)
  • 过去早期的Python版本,Type和Class在Python中是同义词,所以我想我并不是真的这样看. (8认同)
  • 从技术上讲,每个类都是一个类型,但不是每个类都是类."类"是一种实现类的典型行为(无论语言的作者认为是什么)的类型,即该类上的函数获取对调用实例的引用(`self`参数)并且可以是通过调用类型实例化.Python已经有两个类类似的类型,`types.ClassType`又叫`classobj`又叫old-style-class和`type`又叫new-style-class.但是,您可以编写一个不像类一样的新类型. (4认同)

Gar*_*tty 5

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

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