使用__class__
在类中创建新实例是个好主意吗?
以下代码是执行此操作的示例:
from collections import namedtuple
_Position = namedtuple('Position', ['x', 'y'])
class Position(_Position):
def __add__(self, other):
return __class__(self.x + other.x, self.y + other.y)
使用实际的类名称听起来像重复的代码给我。如果类的名称发生了变化,我必须在所有情况下都进行更改,即使现代IDE可以为您做到这一点。
顺便说一句。什么类型的变量是__class__
?你不应该只能使用self.
访问它吗?
答案 0 :(得分:12)
为了支持super()
的零参数形式,如果在类方法中使用__class__
或super()
,编译器会添加对类的隐式引用。请参阅Creating the class object。
您找到的示例代码(ab)在添加时使用此小事实创建Position
的新实例。
就个人而言,我会使用type(self)
代替,因为这是确定任何对象的类型或类的正确API方法。 type(self)
将在适当情况下使用self.__class__
:
def __add__(self, other):
return type(self)(self.x + other.x, self.y + other.y)
如果你想支持子类化, 是个好主意。 Position
的任何子类在添加到一起时都将返回正确的子类型。使用__class__
不会这样做,因为它总是指向Position
,即使对于子类:
>>> class Foo:
... def method(self):
... print(__class__)
... print(type(self))
...
>>> class Bar(Foo):
... pass
...
>>> Bar().method()
<class '__main__.Foo'>
<class '__main__.Bar'>
当然,如果这是你的意图(绕过子类),我仍然更喜欢使用explict类名而不是__class__
;显性优于隐式。