如何从转换后的参数集合动态创建类



Python来说很新,所以下面的代码非常粗糙,主要只是为了解释我的想法。

我正在尝试做的是从数据库查询动态创建对象。查询将返回创建对象所需的字段。但是,由于使用了 ADO,我需要在初始化类之前转换原始值。

对以下伪代码的可能改进是在查询中返回类名和/或使用带有数据库列名作为键的 kwargs。

使用 Python 3.6。

def main():
dbRow = GetAPersonRowFromDB()
personFromRow = CreateObjectFromDatabase(Person, dbRow, "name", "gender")
def transform(value):
transformedValue = #do something to the value
return transformedValue
def CreateObjectFromDatabase(className, *args):
transformedArgs = []
# apply transform() to each *args item
for arg in args:  
transformedArgs.append(transform(dbRow[arg]))
obj = className(transformedArgs)
return obj
class Person:
def __init__(self, name, gender):
self.Name = name
self.Gender = gender
def __init__(self, *args):
self.Name = args[0]
self.Gender = args[1]

我最终使用了基类中的派生类。我相信它可以以更优雅的方式完成,但这适用于最少的样板代码。

# a dynamic object that gets constructed from kwargs
class DataObject(object):
@classmethod
def fromDictionary(cls, **kwargs):
return cls(**kwargs) 
@classmethod
def type(cls):
return cls.__module__    # will only work if each class is in its own module

class Person(DataObject):
# DB column names must match parameter names
def __init__(self, name, gender):
self.Name = name
self.Gender = gender

def CreateObjectFromDatabase(className, recRow):
transformedArgs = {}
for i in range(recRow.Fields.Count):
item = recRow.Fields.Item[i]
transformedArgs[str.lower(item.Name)] = TransformSomehow(item.Value)
obj = className.fromDictionary(**transformedArgs)
return obj
def main():
dbRow = GetAPersonRowFromDB()
personFromRow = CreateObjectFromDatabase(Person, dbRow)

正在使用type((方法创建对象,例如

type('Person', (DataObject, ), transformedArgs)

但这会创建类型"类型"的对象,这些对象不适合我的目的。

最新更新