如何在运行时给类添加/移除属性描述符
描述符必须定义在类上才能生效,动态添加到实例会失效;正确方式是直接赋值给类(如A.dynamic_attr = MyDescriptor()),而非实例或类的__dict__;移除需delattr(A, 'attr');推荐用ToggleableDescriptor等封装方案替代频繁修改类属性。
Python 中直接给实例动态添加描述符会失效
描述符(descriptor)必须定义在类上,不能只挂到实例 __dict__ 里。你写 obj.attr = MyDescriptor(),Python 不会触发 __get__ 或 __set__,它只是普通赋值。这是最常踩的坑——误以为描述符像普通属性一样可运行时“塞”进对象。
通过修改类的 __dict__ 添加描述符
描述符生效的前提是它作为类属性存在。所以要在运行时添加,得操作类本身(不是实例),且需避开类体定义阶段的限制。可行方式是直接写入类的 __dict__(注意:仅对新式类、且类未冻结时有效):
class A:
pass
class MyDescriptor:
def get(self, obj, cls):
return "from descriptor"
def set(self, obj, value):
print(f"set to {value}")
✅ 正确:添加到类 A 上
A.dynamic_attr = MyDescriptor()
a = A()
print(a.dynamic_attr) # 输出:from descriptor
要点:
-
A.dynamic_attr = ...是最简单可靠的方式,本质是给类对象设属性 - 不能用
A.__dict__['dynamic_attr'] = ...直接写入,因为__dict__是只读 proxy(对用户类而言) - 如果类用了
__slots__,且未包含该属性名,则后续无法添加(会报AttributeError)
移除描述符只能靠 delattr 类属性
想“卸载”一个描述符,不是删实例上的值,而是从类上删除该属性名:
PageGen
AI页面生成器,支持通过文本、图像、文件和URL一键生成网页。
delattr(A, 'dynamic_attr') # 或等价写法:del A.dynamic_attr
之后再访问 a.dynamic_attr 就会触发 AttributeError(除非实例自己有同名属性)。注意:
-
del a.dynamic_attr只删实例字典里的值,不影响类上描述符行为 - 如果描述符实现了
__delete__,del A.dynamic_attr不会调用它——那是对实例操作时才触发的 - 移除后,原描述符对象若无其他引用,会被垃圾回收
需要真正“按需开关”描述符?考虑封装代理或元类
频繁增删类属性在生产环境较危险:影响所有实例、线程不安全、可能破坏继承链。更稳妥的做法是把逻辑收进一个始终存在的描述符里,让它内部根据状态决定是否代理:
class ToggleableDescriptor:
def __init__(self, default_value=None):
self._default = default_value
self._enabled = True
def enable(self):
self._enabled = True
def disable(self):
self._enabled = False
def __get__(self, obj, cls):
if obj is None:
return self
if self._enabled:
return getattr(obj, '_stored_value', self._default)
return self._default
使用:
class B:
attr = ToggleableDescriptor("fallback")
b = B()
B.attr.disable() # 所有实例都受影响
print(b.attr) # fallback
这种模式绕开了动态改类结构的需求,也更容易测试和调试。真正的运行时“添加/移除”描述符,本质上是在修改类契约,要格外小心作用域和生命周期。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
万代南梦宫移除《数码宝贝物语:时空异客》D加密 大小减小300MB
2026-07-11万代南梦宫与Media.Vision工作室今日发布更新,移除了《数码宝贝物语:时空异客》中的Denuvo加密技术。该游戏于去年10月发售,此前仅被DenuvOwO团队利用虚拟机监控程序破解。游戏可执行文件体积缩小了335MB。 《数码宝贝物语:时空异客》着重于世界间的穿梭旅行,并逐步揭开世界毁灭之谜。玩家将在现实世界与栖息着随身怪兽的数字世界之间往返跳跃。
我的世界怎样把附魔属性放进书里面2026年版
2026-07-11我的世界里面所有的道具装备都可以进行附魔,今天给大家带来了游戏里面的把附魔属性放进书里面方法,还有小伙伴不清楚,那么下面就是相关的内容. 我的世界把附魔属性放进书里面方法 我的世界中有三种方法将附魔属性转移到装备上 1、使用附魔书转移附魔属性。 2、使用装备附魔属性转移附魔属性。 3、使用附魔台附魔装备。 1、我的世界中可以使用附魔书将附魔转移到装备上。需要使用到的工具有铁砧、附魔书、装备(这里采...
三国杀:一将成名谋徐盛属性一览
2026-07-11三国杀一将成名谋徐盛属性介绍谋徐盛是一张SSS武将卡牌,属于吴国势力,每回合每项限一次,你使用手牌时,可选择一项:1.令此牌伤害+X;2.摸X张牌(X你本回合此前与此牌连续使用同颜色的牌数)。 三国杀:一将成名谋徐盛属性一览: 体力:4 势力:吴 【勤强】 每回合每项限一次,你使用手牌时,可选择一项:1.令此牌伤害+X;2.摸X张牌(X你本回合此前与此牌连续使用同颜色的牌数)。 【疑阵】 当你受到...
异世界的城主大人属性对技能效果的影响介绍
2026-07-11异世界的城主大人属性对技能效果的影响一览,属性=角色属性+士兵属性,即面板中组合属性那一列,组合属性即局内属性,本篇就为大家介绍属性对技能效果的一系列影响介绍。 异世界的城主大人属性对技能效果的影响介绍: 首先我们需要明确 属性=角色属性+士兵属性 即面板中组合属性那一列,组合属性即局内属性 (需要注意的是面板显示的并不是准确值,小数部分并没有显示,运算中用到的还是小数) 受属性影响的技能分为三类...
三国杀:一将成名神曹丕属性技能介绍
2026-07-11三国杀一将成名神曹丕技能效果如何,创玩节专属武将「神曹丕」上线!当你对其他角色造成伤害后,该角色下次在其准备阶段、结束阶段或出牌阶段内发动技能后,若该角色因此技能摸牌或使用了牌,你可以摸等量同名牌(至多为5)。 三国杀:一将成名神曹丕属性技能介绍: 体力:4/4 势力:神 【阴鸷】 出牌阶段限一次,你可以选择一名其他角色并摸X张牌,该角色直至其回合开始所有非锁定技失效直且每次使用或打出手牌后你摸X...
迷你世界符文属性大全及效果图2026年
2026-07-11迷你世界里面的符文是非常的多的,今天给大家带来的是符文属性大全及效果的介绍,还有很多的小伙伴不清楚是什么,那么下面就为大家带来了具体的内容. 迷你世界符文属性大全及效果 现在一共有三种符文,分别是攻击、防御、效率,其中攻击是给武器的,防御是给防具的,效率是给工具的。不同的符文,分别有三个形态,分别是大中小。一个物品可以装备五个符文,不同的符文,鉴定出来是不同的效果。除此之外,不同的符文,坚定出来,...
《毁灭战士:黑暗时代》移除D加密 DLC已同步上线
2026-07-09据悉,Bethesda与idSoftware决定移除《毁灭战士:黑暗时代》中的D加密保护。 这一举措与今日发布的新扩展内容《启示录》同步推出。该保护机制在游戏发行14个月后被移除。今年春季,D加密保护已被传统派黑客voices38破解。 《毁灭战士:黑暗时代》现已登陆PC、PS5及XboxSeriesX/S平台。
这城有良田李清照和长孙无垢属性技能区别分析
2026-07-09这城有良田李清照和长孙无垢核心对比解析,长孙无垢偏向于“控场干扰”的稳健型法核,适合打节奏反制;李清照偏向于“高爆发+真实伤害”的收割型法核,适合打高防突破和持续压制。两者各有侧重,需根据自身的氪度、阵容搭配及敌方阵容进行选择。 这城有良田李清照和长孙无垢属性技能区别分析: 一、定位与核心机制对比 1、长孙无垢(宗府/官府双形态) 核心定位:宗府形态为“罪状控场+吸怒干扰”的万金油,官府形态为“罪...
《真・三国无双天下》防具刷取和属性建议
2026-07-09真三国无双天下防具如何刷取,每件装备初始自带一条属性白条,升级解锁剩余白条,一共五条属性,这算是中后期体力消耗点相当于圣遗物,如自带白条为百分比属性即为好的胚子。 《真・三国无双天下》防具刷取和属性建议: 1、属性条百分比>固定数值 2、如腰带、护手、战甲、头盔的自带黄条都是有固定和百分比之分的,挑百分比的升级,其次配饰需要挑选符合自己属性的升级,而鞋子是固定的百分比减免 3、每件装备初始自...
我要当老祖木属性弟子攻略
2026-07-09我要当老祖木属性玩法技巧,木系前中期都是PVE不错的选择,但是PVP前中期表现不佳,后期血量叠起来可以玩,目前最强势的是叠血孢子流派,不建议玩叠毒流。 我要当老祖木属性弟子攻略: 一、功法推荐 推荐理由: 作为木系up限定功法,比起其他功法有断层式的领先,不管是机制封穴还是被动免伤加怒气都是不错的。如果没有此功法就使用星级最高的木系功法即可,其他木系功法都很拉胯随便用 二、长老推荐 百分比生命值伤...
