【发布时间】:2021-09-27 02:50:55
【问题描述】:
对于一个类Foo,
class Foo:
...
有没有办法在Foo.XXX(任意类属性XXX,例如bar、bar2等)被解析时调用特定方法,但在Foo().XXX(一个任意实例属性)是否已解决?据我所知,覆盖
def __getattr__(self, a):
...
仅适用于第二种情况。我想受益于 __getattr__ for instances 仅在未找到相应属性时才被调用。有谁知道这应该如何解决?我已经阅读了the manual 并没有发现任何相关性。
我并不特别关心如果有人试图为Foo 的任何类或实例属性赋值会发生什么。
用例(避免XY):
Foo 类是信使。 Foo 的实例基本上是带有额外步骤的元组。但是,Foo 有一些特殊情况,我想将其存储为Foo 的类属性(我使用特殊的装饰器进行了管理)。然而,Foo 的特殊情况的数量正在逐渐增加,而它们的差异非常微不足道。每当有人想要Foo.SPECIAL_CASE_123 时调用这个特殊函数对我来说在代码方面非常有效,因为从"SPECIAL_CASE_123" 到实际特殊情况的映射非常快并且非常类似于将"SPECIAL_CASE_456" 映射到其他相应的特殊情况案例。
【问题讨论】:
-
需要更清楚一点:所以给定
foo = Foo(),尝试分配给实例时会发生什么,即foo.XXX = some_value?在任何情况下,您似乎都试图拦截或修改object attribute lookup 以阻止特定步骤(即在实例级别)。解释您的确切用例也非常有用,因为很少需要这样做(以避免an XY problem)。 -
@metatoaster 感谢您关心我的问题,我会更新正文。
-
如果您可以通过填写主体(以显示某些属性)和示例代码来完成示例
class Foo:以通过类和实例访问它以及预期的行为会更好代码。 -
与其实现神奇的属性查找行为,不如考虑编写一个静态方法或类方法来管理这些“特殊情况”实例。
-
@CaptainTrojan:是的,但是你可以用一个类方法来完成所有这些。您不需要为每个特殊实例编写单独的方法。
标签: python attributes metaclass magic-methods getattr