gpt4 book ai didi

python - 使用 __class__ 创建实例

转载 作者:太空狗 更新时间:2023-10-29 21:29:31 25 4
gpt4 key购买 nike

使用 __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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com