Welcome to jaraco.classes documentation!#
For Enterprise
Professional support for jaraco.classes is available as part of the Tidelift Subscription. Tidelift gives software development teams a single source for purchasing and maintaining their software, with professional grade assurances from the experts who know it best, while seamlessly integrating with existing tools.
Routines for obtaining the class names of an object and its parent classes.
- jaraco.classes.ancestry.all_bases(c: type[object]) list[type[Any]] #
return a tuple of all base classes the class c has as a parent. >>> object in all_bases(list) True
- jaraco.classes.ancestry.all_classes(c: type[object]) list[type[Any]] #
return a tuple of all classes to which c belongs >>> list in all_classes(list) True
- jaraco.classes.ancestry.iter_subclasses(cls: type[object]) Iterator[type[Any]] #
Generator over all subclasses of a given class, in depth-first order.
>>> bool in list(iter_subclasses(int)) True >>> class A(object): pass >>> class B(A): pass >>> class C(A): pass >>> class D(B,C): pass >>> class E(D): pass >>> >>> for cls in iter_subclasses(A): ... print(cls.__name__) B D E C >>> # get ALL classes currently defined >>> res = [cls.__name__ for cls in iter_subclasses(object)] >>> 'type' in res True >>> 'tuple' in res True >>> len(res) > 100 True
meta.py
Some useful metaclasses.
- class jaraco.classes.meta.LeafClassesMeta(name: str, bases: tuple[type[object], ...], attrs: dict[str, object])#
Bases:
type
A metaclass for classes that keeps track of all of them that aren’t base classes.
>>> Parent = LeafClassesMeta('MyParentClass', (), {}) >>> Parent in Parent._leaf_classes True >>> Child = LeafClassesMeta('MyChildClass', (Parent,), {}) >>> Child in Parent._leaf_classes True >>> Parent in Parent._leaf_classes False
>>> Other = LeafClassesMeta('OtherClass', (), {}) >>> Parent in Other._leaf_classes False >>> len(Other._leaf_classes) 1
- class jaraco.classes.meta.TagRegistered(name: str, bases: tuple[type[object], ...], namespace: dict[str, object])#
Bases:
type
As classes of this metaclass are created, they keep a registry in the base class of all classes by a class attribute, indicated by attr_name.
>>> FooObject = TagRegistered('FooObject', (), dict(tag='foo')) >>> FooObject._registry['foo'] is FooObject True >>> BarObject = TagRegistered('Barobject', (FooObject,), dict(tag='bar')) >>> FooObject._registry is BarObject._registry True >>> len(FooObject._registry) 2
‘…’ below should be ‘jaraco.classes’ but for pytest-dev/pytest#3396 >>> FooObject._registry[‘bar’] <class ‘….meta.Barobject’>
- attr_name = 'tag'#
- class jaraco.classes.properties.NonDataProperty(fget: Callable[[object], object])#
Bases:
object
Much like the property builtin, but only implements __get__, making it a non-data property, and can be subsequently reset.
See http://users.rcn.com/python/download/Descriptor.htm for more information.
>>> class X(object): ... @NonDataProperty ... def foo(self): ... return 3 >>> x = X() >>> x.foo 3 >>> x.foo = 4 >>> x.foo 4
‘…’ below should be ‘jaraco.classes’ but for pytest-dev/pytest#3396 >>> X.foo <….properties.NonDataProperty object at …>
- class jaraco.classes.properties.classproperty(fget: _GetterCallable[_T] | _GetterClassMethod[_T], fset: _SetterCallable[_T] | _SetterClassMethod[_T] | None = None)#
Bases:
Generic
[_T
]Like @property but applies at the class level.
>>> class X(metaclass=classproperty.Meta): ... val = None ... @classproperty ... def foo(cls): ... return cls.val ... @foo.setter ... def foo(cls, val): ... cls.val = val >>> X.foo >>> X.foo = 3 >>> X.foo 3 >>> x = X() >>> x.foo 3 >>> X.foo = 4 >>> x.foo 4
Setting the property on an instance affects the class.
>>> x.foo = 5 >>> x.foo 5 >>> X.foo 5 >>> vars(x) {} >>> X().foo 5
Attempting to set an attribute where no setter was defined results in an AttributeError:
>>> class GetOnly(metaclass=classproperty.Meta): ... @classproperty ... def foo(cls): ... return 'bar' >>> GetOnly.foo = 3 Traceback (most recent call last): ... AttributeError: can't set attribute
It is also possible to wrap a classmethod or staticmethod in a classproperty.
>>> class Static(metaclass=classproperty.Meta): ... @classproperty ... @classmethod ... def foo(cls): ... return 'foo' ... @classproperty ... @staticmethod ... def bar(): ... return 'bar' >>> Static.foo 'foo' >>> Static.bar 'bar'
Legacy
For compatibility, if the metaclass isn’t specified, the legacy behavior will be invoked.
>>> class X: ... val = None ... @classproperty ... def foo(cls): ... return cls.val ... @foo.setter ... def foo(cls, val): ... cls.val = val >>> X.foo >>> X.foo = 3 >>> X.foo 3 >>> x = X() >>> x.foo 3 >>> X.foo = 4 >>> x.foo 4
Note, because the metaclass was not specified, setting a value on an instance does not have the intended effect.
>>> x.foo = 5 >>> x.foo 5 >>> X.foo # should be 5 4 >>> vars(x) # should be empty {'foo': 5} >>> X().foo # should be 5 4
- fget: _ClassPropertyAttribute[_GetterClassMethod[_T]]#
- setter(fset: _SetterCallable[_T] | _SetterClassMethod[_T]) Self #