from collections.abc import Callable

class CachedProperty:
    def __init__(self, func: Callable) -> None: ...
    def __get__(self, obj, typ): ...
    def __set__(self, obj, value) -> None: ...

# note: this is a lie to make type checkers happy (they special
# case property). cache_readonly uses attribute names similar to
# property (fget) but it does not provide fset and fdel.
cache_readonly = property

class AxisProperty:
    def __init__(self, axis: int = ..., doc: str = ...) -> None: ...
    def __get__(self, obj, typ): ...
    def __set__(self, obj, value) -> None: ...
