使用__class__创建实例

时间:2013-01-01 16:41:17

标签: python python-3.x code-duplication

使用__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.访问它吗?

1 个答案:

答案 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__;显性优于隐式。