如何在Python中获取泛型类属性

Jie*_*eng 7 python generics

我有一堂课,比如:

class ExampleClass(BaseClass[Someclass]):
  pass


class BaseClass(AbstractBaseClass, Generic[T]):
  pass
Run Code Online (Sandbox Code Playgroud)

我希望能够做一些事情,比如ExampleClass.targetType我将返回的地方,Someclass.__name__我该怎么做,BaseClass我似乎做不到T.__name__

我可以通过定义类似的方法来解决问题

class ExampleClass(BaseClass[Something]):
    version = 1

    def get_target_class_name() -> str:
        return Something.__name__
Run Code Online (Sandbox Code Playgroud)

但我需要为每堂课复制这个

Hac*_*ck5 9

您可以定义一个元类:

from typing import Generic, TypeVar

T = TypeVar("T")

class AbstractBaseClass:
    pass

class BaseClassMeta(type):
    def __init__(cls, name, bases, attrs):
        assert "target_type" not in attrs
        if len(attrs["__orig_bases__"]) == 1:
            base, = attrs["__orig_bases__"]
            if args := getattr(base, "__args__", None):
                cls.target_type = args
        return super().__init__(name, bases, attrs)

class BaseClass(AbstractBaseClass, Generic[T], metaclass=BaseClassMeta):
    pass

class TargetClass():
    pass

class ExampleClass(BaseClass[TargetClass]):
    pass

print(ExampleClass().target_type) # TargetClass
Run Code Online (Sandbox Code Playgroud)

这将使 BaseClass 的所有子类具有单个超类(该超类具有单个泛型参数)target_type,并具有设置为该参数的 attribute 。这也适用于类的实例和子类。