python - 使用 __class__ 创建实例

标签 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. 访问它吗?

最佳答案

支持 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/

相关文章:

python - 如何对 pandas 列中的列表执行一次热编码?

python - 在函数上定义@property

c++ - 避免 const 和非常量成员函数中的代码重复

python - 谷歌数据流/Python : Import errors with save_main_session and custom modules in __main__

python - 从 numba 创建一个由 njit 装饰的 numpy 数组

python - 如何将任何数字四舍五入到最接近的 5 的倍数?

java - jsp中如何减少重复?

unit-testing - 在单元测试中重复的代码是否更容易被容忍?

python - 我可以使用字典来调用相同的函数但不同的参数吗?

python-3.x - python : How to call a variable in an input prompt?