如何让__set_name__方法在类外部生效?
如何让__set_name__方法在类外部生效?
嘿,这个问题问得很到位!其实__set_name__是Python描述符协议里的方法,它的触发逻辑是当对象被赋值为类的属性时,Python解释器才会自动调用它,把所属的类(owner)和属性名(name)传进去。这就是为啥你在类T里给n赋值时它能正常打印,但直接实例化N()时没反应——因为没触发那个自动调用的条件呀。
那要在类外部让它生效,有两种简单的办法:
手动调用
__set_name__方法:既然Python不会自动触发,那我们自己来调用就好啦!你可以给它传任意的owner(甚至是None)和你想要的name参数,比如:class N: def __set_name__(self, owner, name): print(f'{name = }') # 类外部实例化后手动调用 n = N() n.__set_name__(None, "external_n") # 会打印 name = 'external_n'动态创建临时类触发自动调用:如果你想更贴近类内部的原生触发逻辑,可以动态创建一个临时类,把
N的实例作为这个类的属性。这样Python就会像处理普通类属性一样自动调用__set_name__了:# 动态生成一个临时类,把N的实例赋值给它的属性 TempClass = type("TempClass", (), {"n": N()}) # 这时候会自动打印 name = 'n'
简单来说,__set_name__本来就是为类属性场景设计的,类外部要让它跑起来,要么手动调用,要么靠动态类来触发自动调用逻辑~
备注:内容来源于stack exchange,提问作者Howard Lovatt
相关产品推荐
相关产品推荐

