class C(): .... def __add__(self, other): return type(self)(self.val + other.val) ....
type(self) когда нужно такое преобразование типа и нужно ли вообще ?
class C(): .... def __add__(self, other): return type(self)(self.val + other.val) ....
lerrtype(self) - конструктор объекта текущего класса, (self.val + other.val) - параметр конструктора, т.е. сумма складываемых значений. Тоже стало интересно, в чем смысл такого приведения - попробовал набросать возможный вариант:
тут может использоваться приоритет на использовании метода __str__(self), если он например вообще не определен в родительском классе. Другого применения даже не представляю. (возможно ошибаюсь)
class C: def __init__(self, v) -> None: self.val = v def __add__(self, other): return type(self)(self.val + other.val) def __str__(self) -> str: return f"C: value={self.val}" class D(C): def __str__(self) -> str: return f"D: value={self.val}" c1, c2 = C(1), C(2) print(c1 + c2) d1, d2 = D(100), D(150) print(d1 + d2) # благодаря приведению сумма - объект класса D, а не C
Egorro13нет, type это не конструктор объектов, а конструктор типов. В питоне типы создаются динамически, а type - базовый метакласс для всех типов.
type(self) - конструктор объекта текущего класса
def __add__(self, other): return С(self.val + other.val)
def __add__(self, other): return self.__class__(self.val + other.val)
FishHookТак речь же о type(self), а не просто type - судя по всему, возвращается что-то типа ссылки на класс объекта self, эту ссылку дальше используем для вызова конструктора, т.е. создания объекта?
нет, type это не конструктор объектов, а конструктор типов. В питоне типы создаются динамически, а type - базовый метакласс для всех типов.
FishHookДобавил еще на проверку вывод type(d1) == d1.__class__ - выдает True, т.е. в принципе выглядит как одно и то же…
В вашем примере, класс (то есть тип объекта) и так известен, использовать type бессмысленно.
Egorro13питон - язык с долгой историей, он неоднократно изменялся и весьма существенно. Когда-то давно, в питоне существовали только классы, которые сейчас называются “классы старого стиля” для них это утверждение неверно
т.е. в принципе выглядит как одно и то же…
fish-pc% python2
Python 2.7.16 (default, Mar 11 2019, 18:59:25)
[GCC 8.2.1 20181127] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
... pass
...
>>> x = X()
>>> x.__class__
<class __main__.X at 0x7fdd1ffb2c18>
>>> type(x)
<type 'instance'>
>>> type(x) == x.__class__
False