How special is class access here? It’s unsafe to ever inherit a mutable attribute containing Self, even if access only ever happens on instances:
class Parent:
x: list[Self]
class Child(Parent):
pass
def f(p: Parent):
p.x.append(Parent())
c = Child()
f(c)
# no type errors above, but now c.x contains a Parent instance
I think this is what @mikeshardmind was referring to above.
I think it is hard to phrase this restriction partly because the fully coherent restriction would be phrased in terms of Liskov restrictions on inheritance in general and variance of Self types, not in terms of limitations on what you can access via a class.