【发布时间】:2013-08-28 21:14:02
【问题描述】:
class A:
def foo(self):
print "foo()"
getattr(A, foo) # True
A.foo() # error
getattr(A(), foo) # True
A().foo() # prints "foo()"
话虽如此,这是我的问题:
我希望将测试用例元信息存储为测试用例类对象本身的属性,而不是它们的实例。
我有一个要提取的属性名称列表,但如果有同名的实例方法,那么getattr(class_obj, attr) 将返回 True,但getattr(class_obj, attr)() 会引发错误。
有没有办法告诉 getattr 不包含实例化类的属性而只包含类对象本身的属性?
编辑:我尝试直接访问class_obj.__dict__(我理解这是不好的做法),但它不包括一些属性,如__name__
编辑:改写问题。有没有办法区分 obj 类的方法和类实例的方法?
【问题讨论】:
-
"有没有办法告诉 getattr 不包含实例化类的属性,而只包含类对象本身的属性?"我不确定这意味着什么。
foo()是一个(非静态)方法,因此名为foo的属性将同时存在于类及其实例上。A.foo()引发错误的原因是因为您不能在类对象上调用实例方法,但它仍然作为未绑定方法存在。我认为您可能会混淆属性和方法。 “没有属性”和“属性不可调用”是不同的东西。 -
那么我想 getattr 不是我想要的。您是否知道仅在使用@classmethod 装饰时才获取属性的替代方法?
-
(而且,好吧,我很抱歉,如果这显得居高临下,但这似乎是在你运行之前先走的情况。你确定你应该在 Python 对象的怪癖之前进行元编程吗?模型是内部结构化的渗入?)
-
@waldol1 你想完成什么?区分类方法和实例方法?
-
@waldo1 使用“请求宽恕而不是许可”的方法怎么样?只需执行
A.foo(),使用try..except捕获错误,如果发生错误,就假装该属性不存在。
标签: python class-method getattr