Python: self.__class__ vs. type(self)
我想知道两者之间是否有区别
1 2 3
| class Test(object):
def __init__(self):
print self.__class__.__name__ |
和
1 2 3
| class Test(object):
def __init__(self):
print type(self).__name__ |
?
有没有理由选择其中一个呢?
(在我的用例中,我想用它来确定记录器的名称,但我想这并不重要)
- @在某些情况下,用户和它们在python 3中是有区别的(参见flavien的答案)
1 2 3 4 5 6
| >>> class Test(object): pass
>>> t = Test()
>>> type(t) is t.__class__
True
>>> type(t)
__main__.Test |
所以这两个是一样的。我会使用self.__class__,因为它更明显是什么。
但是,由于旧样式类的实例类型为instance,而新样式类实例的类型为其类,因此type(t)不适用于旧样式类:
1 2 3 4 5 6
| >>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance |
- 真的?你可以通过type(self)访问self.__class__?我认为后者更清晰,打字更少,而且更一致——我怀疑你会在len([1, 2, 3])上做[1, 2, 3].__len__()。
- 好吧,len()告诉你它做了什么,但是type(self)没有立即告诉你"给你上课"。
- Python的早期版本、类型和类在Python中是同义的,所以我想我并没有真正看到它是这样的。
- 从技术上讲,每个类都是一个类型,但不是每个类型都是一个类。"class"是实现类的典型行为(无论语言的作者认为是什么)的类型,即该类上的函数获取对调用实例(self参数)的引用,并且可以通过调用该类型来实例化。python已经有两种类类型,types.ClassTypeake classobjaka old style类和typeaka new style类。但是,您可以编写一个行为与类不同的新类型。
- 我不知道旧式课程的不同行为。我想这对我有好处。谢谢您
据我所知,后者只是做前者的更好方式。
这在python中实际上并不少见,比如repr(x),它只是调用x.__repr__()或len(x),它只是调用x.__len__()。python更喜欢为您可能在一系列类中使用的公共函数使用内置函数,并且通常通过调用__x__()方法来实现这些函数。