擅长:python、mysql、java
<p>我不知道检查basestring或object的目的是什么?另外,除非您有指向此类可调用项的属性,否则dict</strong>将不包含任何可调用项,但在这种情况下,这不是object的一部分吗?</p>
<p>因此,不要检查各种类型和值,而是让todict转换对象,如果它引发异常,则使用原始值。</p>
<p>只有当obj没有dict时,todict才会引发异常
e、 g</p>
<pre><code>class A(object):
def __init__(self):
self.a1 = 1
class B(object):
def __init__(self):
self.b1 = 1
self.b2 = 2
self.o1 = A()
def func1(self):
pass
def todict(obj):
data = {}
for key, value in obj.__dict__.iteritems():
try:
data[key] = todict(value)
except AttributeError:
data[key] = value
return data
b = B()
print todict(b)
</code></pre>
<p>它打印{'b1':1,'b2':2,'o1':{'a1':1}
可能还有其他一些情况需要考虑,但这可能是一个好的开始</p>
<p><strong>特殊情况</strong>
如果一个对象使用插槽,那么您将无法获得<strong>dict</strong>例如</p>
<pre><code>class A(object):
__slots__ = ["a1"]
def __init__(self):
self.a1 = 1
</code></pre>
<p>插槽情况的修复方法可以是使用dir(),而不是直接使用dict</p>