Jos*_*hua 8 python code-duplication python-3.x
用于__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)
Run Code Online (Sandbox Code Playgroud)
使用实际的类名称听起来像重复的代码给我.如果类的名称发生了变化,我必须在所有情况下更改它,即使现代IDE可以为您做到这一点.
顺便说一句.什么样的变量是__class__?你不应该只能访问它self.吗?
Mar*_*ers 13
为了支持零参数形式super(),编译器在类方法中使用__class__或者super()在类方法中使用时添加对类的隐式引用.请参见创建类对象.
您找到的示例代码(ab)使用这个小的factoid来创建Position添加时的新实例.
就个人而言,我会使用type(self),因为这是确定任何对象的类型或类的正确API方法.type(self)将self.__class__在适当的地方使用:
def __add__(self, other):
return type(self)(self.x + other.x, self.y + other.y)
Run Code Online (Sandbox Code Playgroud)
如果你想支持子类化,那是个好主意.任何子类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'>
Run Code Online (Sandbox Code Playgroud)
当然,如果这是你的意图(绕过子类),我仍然更喜欢使用explict类名而不是使用__class__; 显性比隐含更好.