Skip to content

prefer-self-type-annotation

Prefer Self for self-returning methods and alternate constructors.

Why

Self preserves the concrete subclass type when an inherited method returns its receiver or constructs through its class receiver.

Fix

Import Self from typing (or typing_extensions on Python before 3.11) and use it as the return annotation.

Examples

Before — flagged Alternate constructor names its enclosing class
app/builder.py
class Builder:
@classmethod
def create(cls) -> "Builder":
return cls()
After — preferred Alternate constructor preserves subclass type
app/builder.py
from typing import Self
class Builder:
@classmethod
def create(cls) -> Self:
return cls()
Before — flagged Fluent method names its enclosing class
app/builder.py
class Builder:
def set_name(self, name: str) -> "Builder":
self.name = name
return self
After — preferred Fluent method preserves subclass type
app/builder.py
from typing import Self
class Builder:
def set_name(self, name: str) -> Self:
self.name = name
return self