说我有这个班:
class MyClass(object):
my_attrib = 'foo'
my_other_attrib = 'bar'
def mymethod():
pass
现在我怎样才能获得MyClass类,WITHOUT方法和内置函数__dict__
等等的属性?
我希望在应用于上述课程时获得类似{'my_attrib':'foo', 'my_other_attrib':'bar'}
的字典。
答案 0 :(得分:7)
您可以从__dict__
:
def getAttributes(clazz):
return {name: attr for name, attr in clazz.__dict__.items()
if not name.startswith("__")
and not callable(attr)
and not type(attr) is staticmethod}
编辑:对于类属性和描述符,行为略有不同的替代方法:
def getAttributes2(clazz):
attrs = {}
for name in vars(clazz):
if name.startswith("__"):
continue
attr = getattr(clazz, name)
if callable(attr):
continue
attrs[name] = attr
return attrs
(实际上,这应该与第一个版本很少不同。)
答案 1 :(得分:3)
这应该让你接近:
import inspect
class MyClass(object):
my_attrib = 'foo'
my_other_attrib = 'bar'
def mymethod():
pass
for name, value in inspect.getmembers(MyClass):
if not inspect.ismethod(value) and not name.startswith('__'):
print name
输出:
my_attrib
my_other_attrib
注意 - 可能有更好/更官方的方法来做到这一点,但这应该指向正确的方向。
答案 2 :(得分:2)
__dict__
为您提供了所有这些,但您可以使用C
扩展名来获得您想要的内容。不知道为什么你会这样做。
您可以使用types
(doc)来区分__dict__
的成员。
答案 3 :(得分:1)
您可以使用内置的dir()
来获取所有内容,然后进行过滤。您将不需要inspect
模块。
def get_attrs_without_methods(klass):
attrs = dir(klass)
d = {}
for x in attrs:
if x.startswith('__'): continue
value = getattr(self,x)
if not callable(value):
d[x] = value
return d
有时,您可能只想获得 ONLY 类变量,而不是类变量 AND 实例变量。
您可以依靠__dict__
筛选出实例变量。或者,您可以使用__class__
获取属性并筛选出方法。 __class__
不返回实例变量。
#after collecting your attributes using the above example...
for attr, value in vars(obj).items():
d.pop(attr) #remove instance variables from the dict
#both vars(obj).items() and obj.__dict__.items() return similar iterable.
请注意,如果对象实现覆盖__dict__
并返回None,则vars(obj)
和obj.__dict__.items()
将不会返回字典。