我有一堂课,比如:
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)
但我需要为每堂课复制这个
您可以定义一个元类:
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 。这也适用于类的实例和子类。