使用 __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.
访问它吗?
最佳答案
支持 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'>
当然,如果这一直是您的意图(绕过子类),我仍然更喜欢使用显式类名而不是使用 __class__
;显式优于隐式。
关于python - 使用 __class__ 创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14112179/