有没有一种方法可以使用__getattr__作为Python类方法



getattr与类的实例配合得很好

class Person:
def __getattr__(self, name):
print(name)
p = Person()
p.john

输出:

john

但它不能作为classmethod:工作

class Person:
@classmethod
def __getattr__(cls, name):
print(name)
Person.john

输出:

AttributeError: type object 'Person' has no attribute 'john'

有没有一种方法可以直接对类使用getattr

__getattr__与大多数特殊方法一样,只在实例的类上查找(绕过实例本身(。由于您试图在类本身上调用它,因此必须在class Person正在实现的类上定义它。默认情况下,它是type(所有类类型的公共根(。

如果你真的需要这样做(我怀疑是XY问题(,你可以用元类(类本身的类(来做:

class PersonMeta(type):
def __getattr__(cls, name):
print(cls, name)
class Person(metaclass=PersonMeta):
def __getattr__(self, name):
return getattr(type(self), name)  # Delegate to metaclass implementation
Person.john
Person().john

在线试用!

请注意,您需要在类本身上实现一个委派版本,以确保它委派回元类的实现(假设您希望它能够在类的实例上运行,而不仅仅是在类本身(。如果元类类的所有实例都应该表现出这种委托行为,则元类本身可以在构造时(在__prepare____new__中(将这种方法动态地附加到类。

最新更新