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__
中(将这种方法动态地附加到类。