[英]__getattr__ on a class and not (or as well as) an instance
我知道我可以编写如下代码:
class A :
def __getattr__ (self, name) :
return name
在一个类的实例上捕获对未定义属性的访问权限,因此:
A().ATTR == 'ATTR'
是真的 。 但有没有办法为班级本身做这个? 我希望能够使以下两行都有效,并且可以区分(即,有不同的魔法方法,或魔术方法可以告诉它是如何被调用的)
a = A().ATTR
b = A.ATTR
我怀疑答案是否定的,但也许有一些深蟒ju ju?
编辑 :实际问题是以向后兼容的方式扩展自定义活动记录库。 ORM代码支持代码
ar = AR_people()
ar.find()
name = ar.name
访问表,其中name
可以映射到不同的列名,例如pe_name
。 我们希望能够写出类似的东西
ar.filter(AR_people.age >= 21)
并最终得到
pe_age >= 21
(就像其他ORM库一样),因此AR_people.age
需要返回一个实现__ge__
的类的实例,依此类推,以进行转换魔术。
您可以使用元类 :
In [1]: class meta(type):
...: def __getattr__(self, name):
...: return name
...:
...:
In [2]: class A(object):
...: __metaclass__ = meta
...: def __getattr__(self, name):
...: return name
...:
...:
In [3]: A().attr
Out[3]: 'attr'
In [4]: A.attr
Out[4]: 'attr'
是的你可以。 元类就是答案。
class MyMetaclass(type):
def __getattr__(cls, name):
return "cls.%s" % name
class A :
__metaclass__ = MyMetaclass
def __getattr__ (self, name) :
return name
print A().ATTR
print A.ATTR
将输出
ATTR
cls.ATTR
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.