我试图用Python编写一个数据库抽象层,它允许您使用链式函数调用构造SQL语句,例如:
results = db.search("book")
.author("J. K. Rowling")
.price("<40.00")
.title("Harry")
.execute()
但是当我试图动态地向db类添加所需的方法时,我遇到了一些问题。在
以下是我代码的重要部分:
^{pr2}$但是,当我运行示例时,例如:
print(db.search("book").price(">4.00").execute())
输出:
{'__Set__': 'harry'}
我是不是走错了路?有没有更好的方法来获取被调用函数的名称或者以某种方式制作函数的“硬拷贝”?在
创建类后,您只需添加搜索函数(方法):
PS:此类有一个
^{pr2}$__init__()
方法,该方法没有family
参数(条件设置器在运行时动态添加,但添加到类中,而不是单独添加到每个实例中)。如果需要创建具有不同条件设置器的Search
对象,则上述方法的以下变体起作用(__init__()
方法有一个family
参数):参考号:http://docs.python.org/howto/descriptor.html#functions-and-methods
如果您确实需要知道存储在其中的属性名称的搜索方法,只需使用
(就在
return set_cond
之前)。在此之前,方法Search.name
具有以下名称:设置其
__name__
属性后,将获得一个不同的名称:以这种方式设置方法名可以使涉及该方法的错误消息更容易理解。在
首先,您没有向类添加任何内容,而是将其添加到实例中。在
其次,您不需要访问dict。使用
self.__dict__[opt] = self.__Set__
可以更好地完成setattr(self, opt, self.__Set__)
。在第三,不要使用
__xxx__
作为属性名。这些保留给Python内部使用。在第四,正如您所注意到的,Python不容易被愚弄。您调用的方法的内部名称仍然是
__Set__
,即使您使用不同的名称访问它。:—)当您将方法定义为def
语句的一部分时,将设置该名称。在您可能想用元类创建和设置options方法。您还可能希望实际创建这些方法,而不是尝试对所有方法使用一个方法。如果你真的只想使用一个
__getattr__
是一种方法,但它可能有点麻烦,我一般建议不要使用它。Lambdas或其他动态生成的方法可能更好。在下面是一些可以帮助您开始的工作代码(不是您试图编写的整个程序,而是一些说明如何将各个部分组合在一起的代码):
相关问题 更多 >
编程相关推荐