From acc4f4104bb9e6a5ad5f34a4f9c8e2f354cec20c Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 25 Jul 2026 15:52:02 +0800 Subject: [PATCH] add `__subclasses__` --- src/bindings/py_object.c | 15 +++++++++++++++ tests/500_reflection.py | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/bindings/py_object.c b/src/bindings/py_object.c index 26dc21c8..19995da8 100644 --- a/src/bindings/py_object.c +++ b/src/bindings/py_object.c @@ -124,6 +124,20 @@ static bool type__annotations__(int argc, py_Ref argv) { return true; } +static bool type__subclasses__(int argc, py_Ref argv) { + PY_CHECK_ARGC(1); + py_TypeInfo* base_ti = py_touserdata(argv); + py_newlist(py_retval()); + + for(py_Type i = 1; i < pk_current_vm->types.length; i++) { + py_TypeInfo* ti = pk_typeinfo(i); + if(ti->base == base_ti->index) { + py_list_append(py_retval(), &ti->self); + } + } + return true; +} + void pk_object__register() { py_bindmagic(tp_object, __new__, pk__object_new); @@ -142,4 +156,5 @@ void pk_object__register() { py_bindproperty(tp_type, "__name__", type__name__, NULL); py_bindproperty(tp_object, "__dict__", object__dict__, NULL); py_bindproperty(tp_type, "__annotations__", type__annotations__, NULL); + py_bindmethod(tp_type, "__subclasses__", type__subclasses__); } \ No newline at end of file diff --git a/tests/500_reflection.py b/tests/500_reflection.py index c4118174..0e7b8ad1 100644 --- a/tests/500_reflection.py +++ b/tests/500_reflection.py @@ -50,3 +50,21 @@ assert hasattr(a, 'zzz') assert not hasattr(a, '') +class Base: + pass + +class Child1(Base): + pass + +class Child2(Base): + pass + +class GrandChild(Child1): + pass + +subs = Base.__subclasses__() +assert type(subs) is list +assert Child1 in subs +assert Child2 in subs +assert GrandChild not in subs +