![](/img/trans.png)
[英]__getattr__ and __getattribute__ for class/static atributes of dynamically generated classes
[英]__getattr__ for class atributes?
对于Foo
类,
class Foo:
...
有没有办法在Foo.XXX
(任意类属性XXX
,例如bar
, bar2
等)被解析时调用特定方法,但不是每当Foo().XXX
(任意实例属性)被解析时? 据我所知,压倒一切
def __getattr__(self, a):
...
仅适用于第二种情况。 我想受益于这样一个事实,即__getattr__
仅在未找到相应属性时才调用实例。 有谁知道这应该如何解决? 我通读了手册,没有发现任何相关性。
如果有人试图为Foo
任何类或实例属性赋值,我并不特别关心会发生什么。
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.