【问题标题】:Python: self.__class__ vs. type(self) [duplicate]Python:self.__class__ vs. type(self) [重复]
【发布时间】:2012-05-10 07:10:54
【问题描述】:

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

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

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

?

有理由偏爱其中一个吗?

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

【问题讨论】:

  • @user 在某些情况下它们在 Python 3 中存在差异(参见 Flavien 的 answer

标签: python


【解决方案1】:
>>> 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

【讨论】:

  • 真的吗?您会通过type(self) 访问self.__class__?我认为后者更清晰,打字更少,更一致 - 我怀疑你会做 [1, 2, 3].__len__() 而不是 len([1, 2, 3])
  • 好吧,len() 会告诉你它的作用——但type(self) 不会立即告诉你“给你上课”
  • 过去早期的 Python 版本,Type 和 Class 在 Python 中是同义词,所以我想我真的不这么看。
  • 技术上每个类都是一个类型,但不是每个类型都是一个类。 “类”是一种实现类的典型行为(无论语言作者认为是什么)的类型,即此类上的函数获取对调用实例的引用(self 参数)并且可以是通过调用类型来实例化。 Python 已经有两种类类型,types.ClassType aka classobj aka old-style-class 和 type aka new-style-class。但是,您可以编写一种行为不像类的新类型。
  • 我不知道旧样式类的不同行为。我想这对我来说是一笔交易(有利于class)。谢谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2013-11-15
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2014-10-15
    • 2010-11-06
    • 2014-01-03
    相关资源
    最近更新 更多