wal*_*ol1 5 python class-method getattr
class A:
def foo(self):
print "foo()"
getattr(A, foo) # True
A.foo() # error
getattr(A(), foo) # True
A().foo() # prints "foo()"
Run Code Online (Sandbox Code Playgroud)
话虽这么说,这是我的问题:
我希望将测试用例元信息存储为测试用例类对象本身的属性,而不是存储在它们的实例上。
我有一个要提取的属性名称列表,但如果存在同名的实例方法,则将getattr(class_obj, attr)返回 True,但getattr(class_obj, attr)()会引发错误。
有没有办法告诉 getattr 不包含实例化类的属性而仅包含类对象本身的属性?
编辑:我尝试class_obj.__dict__直接访问(我理解这是不好的做法),但它不包含一些属性,例如__name__
编辑:改写问题。有没有办法区分 obj 类的方法和类实例的方法?
这够好吗?
import types
class Test(object):
@staticmethod
def foo():
print 'foo'
def bar(self):
print 'bar'
Run Code Online (Sandbox Code Playgroud)
结合:
>>>(isinstance(getattr(Test, 'foo'), types.FunctionType),
isinstance(getattr(Test, 'bar'), types.FunctionType))
True, False
Run Code Online (Sandbox Code Playgroud)
您还可以使用该inspect模块:
>>> inspect.isfunction(Test.foo)
True
>>> inspect.isfunction(Test.bar)
False
Run Code Online (Sandbox Code Playgroud)
通过一些额外的工作,您甚至可以区分类方法与实例方法和静态方法:
import inspect
def get_type(cls, attr):
try:
return [a.kind for a in inspect.classify_class_attrs(cls) if a.name == attr][0]
except IndexError:
return None
class Test(object):
@classmethod
def foo(cls):
print 'foo'
def bar(self):
print 'bar'
@staticmethod
def baz():
print 'baz'
Run Code Online (Sandbox Code Playgroud)
您可以将其用作:
>>> get_type(Test, 'foo')
'class method'
>>> get_type(Test, 'bar')
'method'
>>> get_type(Test, 'baz')
'static method'
>>> get_type(Test, 'nonexistant')
None
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19266 次 |
| 最近记录: |