列出当前存在的所有类

时间:2008-12-16 22:53:43

标签: python

我正在创建一个简单的API,它根据JSON数据创建类型化的类,其中定义了必需的“类型”字段。它使用此字符串定义新类型,在JSON对象中添加字段,实例化它,然后填充实例上的字段。

我希望能够做的是允许在使用我的模块的任何应用程序中预定义这些类型。这样就可以添加JSON对象中找不到的方法和其他特定于应用程序的属性。我想让我的模块检查一个类型是否已经存在,如果存在,请使用它而不是动态创建类型。它仍然会添加JSON对象的属性,但它会回收现有的类型。

我的JSON数据是:

{
    "type": "Person",
    "firstName": "John",
    "lastName": "Smith",
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        "212 555-1234",
        "646 555-4567"
    ]
}

到目前为止我的代码(假设json_object在这一点上是dict):

if not json_object.has_key('type'):
    raise TypeError('JSON stream is missing a "type" attribute.')

##### THIS IS WHERE I WANT TO CHECK IF THE TYPE BY THAT NAME EXISTS ALREADY ####
# create a type definition and add attributes to it
definition = type(json_object['type'], (object,), {})
for key in json_object.keys():
    setattr(definition, key, None)

# instantiate and populate a test object
tester = definition()
for key, value in json_object.iteritems():
    setattr(tester, key, value)

3 个答案:

答案 0 :(得分:3)

如果您想重用之前创建的类型,最好自己缓存它们:

json_types = {}
def get_json_type(name):
  try:
    return json_types[name]
  except KeyError:
    json_types[name] = t = type(json_object['type'], (object,), {})
    # any further initialization of t here
    return t

definition = get_json_type(json_object['type'])
tester = definition()
# or: tester = get_json_type(json_object['type'])()

如果您想将它们添加到模块名称空间,请执行

json_types = globals()

代替。

答案 1 :(得分:1)

您可以使用dir()获取当前环境中所有对象的所有名称列表,并且可以使用globals()获取将这些名称映射到其值的字典。因此,要获得只是类的对象列表,您可以这样做:

import types
listOfClasses = [cls for cls in globals().values() if type(cls) == types.ClassType]

答案 2 :(得分:0)

您可以使用dir()

Python 2.5.2 (r252:60911, Oct  5 2008, 19:29:17)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dir()
['__builtins__', '__doc__', '__name__']
>>> class Foo:
...     pass
...
>>> dir()
['Foo', '__builtins__', '__doc__', '__name__']
>>> type(eval('Foo'))
<type 'classobj'>