Python如何获取作为子类类属性的实例对应的子类名称
解决方案
你要的效果可以通过两种方式实现,分别适配不同的需求场景:
方案1:使用Python描述符协议(推荐,无需修改父类逻辑)
如果你的需求是访问Form.name直接拿到类名字符串,用描述符是最原生简洁的实现:
class Main: # 描述符的__get__方法会自动接收3个参数: # self:当前Main实例,instance:访问属性的类实例(类访问时为None),owner:属性所属的类 def __get__(self, instance, owner): return owner.__name__ class MainGroup: # 原有逻辑保留即可 pass class Form(MainGroup): name = Main()
测试效果:
print(Form.name) # 输出:Form
方案2:通过__init_subclass__钩子绑定所属类(适配需要保留Main实例的场景)
如果你需要Form.name本身仍然是Main类的实例,只是打印时输出类名,就用这个方案修改__repr__:
class Main: def __repr__(self): # 返回提前绑定的所属类名 return repr(self.belong_class_name) class MainGroup: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 子类初始化时自动遍历属性,给Main实例绑定所属类名 for attr_val in cls.__dict__.values(): if isinstance(attr_val, Main): attr_val.belong_class_name = cls.__name__ class Form(MainGroup): name = Main()
测试效果:
print(Form.name) # 输出:'Form' type(Form.name) # 输出:<class '__main__.Main'>
内容的提问来源于stack exchange,提问作者user13699857
相关产品推荐
相关产品推荐

