繁体   English   中英

__getattr__ 用于类属性?

[英]__getattr__ for class atributes?

对于Foo类,

class Foo:
    ...

有没有办法在Foo.XXX (任意类属性XXX ,例如barbar2等)被解析时调用特定方法,但不是每当Foo().XXX (任意实例属性)被解析时? 据我所知,压倒一切

def __getattr__(self, a):
    ...

仅适用于第二种情况。 我想受益于这样一个事实,即__getattr__仅在未找到相应属性时才调用实例。 有谁知道这应该如何解决? 我通读了手册,没有发现任何相关性。

如果有人试图为Foo任何类或实例属性赋值,我并不特别关心会发生什么。

用例(避免XY):

Foo类是一个信使。 Foo实例基本上是带有额外步骤的元组。 但是,有Foo特殊情况,我想将其存储为Foo类属性(我使用特殊的装饰器进行了管理)。 但是, Foo的特殊情况的数量正在逐渐增加,而它们之间的差异却很小。 每当有人想要Foo.SPECIAL_CASE_123时调用这个特殊函数对我来说都是非常有效的代码,因为从"SPECIAL_CASE_123"映射到实际特殊情况非常快,并且非常类似于将"SPECIAL_CASE_456"映射到另一个相应的特殊案件。

使用元类来定义类的行为方式。 具体来说,重新定义类的__getattr__以更改类中缺少的属性的处理方式:

# The "Type of Foo"
class MetaFoo(type):
    def __getattr__(cls, item):
        return f"Dynamically handled: {item}"


class Foo(metaclass=MetaFoo):
    REGULAR_CASE_22 = "Catch 22"

print(Foo.REGULAR_CASE_22)     # Catch 22
print(Foo.SPECIAL_CASE_123)    # Dynamically handled: SPECIAL_CASE_123
print(Foo().REGULAR_CASE_22)   # Catch 22
print(Foo().SPECIAL_CASE_123)  # AttributeError: 'Foo' object has no attribute 'SPECIAL_CASE_123'

请注意,某些属性查找,例如__add__之类的特殊方法,将绕过元类属性查找。

你可以用@classmethod s 试试:

class Foo:        
    @classmethod
    def XXX(self, a):
        return a
print(Foo.XXX('Hello World'))

输出:

Hello World

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM