Нечетный синтаксис (оператор моржа в наследовании)
Я искал грамматику Python и выяснил, что вы можете использовать оператор моржа в наследовании! Не веря, попробовал:
class foo: pass
class bar(foobar := foo):
def x(self):
print("it works!")
b = bar()
b.x()
Это не вызывает каких - либо ошибку синтаксиса (Python 3.8.2)! Какая от этого польза и как она работает?
3 ответа
Это бесполезно - так что не используйте его;-) Здесь разрешены произвольные выражения. Например, это еще более бесполезно:
from random import choice
class C(choice([int, list])):
pass
Радоваться, веселиться;-)
Какая от этого польза и как она работает?
Для оператора моржа при наследовании нет конкретного варианта использования. Он работает просто потому, что класс является выражением, поэтому он позволяет все, что позволяет выражение, включая оператор моржа. Как указано в комментариях, вы можете добиться того же результата, используя:
foobar = foo
class bar(foobar):
...
Другие вещи, разрешенные в выражениях, также будут работать, например, круглые скобки и вызовы функций:
class bar(((foo))):
pass
class bar((lambda x: x)(foo)):
pass
После небольшого эксперимента (и удачи) я обнаружил, что это для таких вещей, как переименование классов при наследовании для них:
class foo:
def __init__(self, x):
pass
class bar(foobar := foo):
def __init__(self):
foobar.__init__(self, 2)
def x(self):
print("it works!")
b = bar()
b.x()
Если удалить оператор моржа, он не работает (очевидно). Я не уверен, что от этого будет действительно польза.