我正在尝试创建一个python类,该类继承elasticsearch类并使用一些自定义方法构建它。我面临的问题是,我希望类构造函数连接到服务器,所以初始化很简单。通常,要连接到服务器,它看起来像这样:
from elasticsearch import Elasticsearch
es = Elasticsearch([{'host': 'XXXXXXX', 'port': XXXX}]
在我称为“elastic”的类中,我希望连接到服务器并在初始化类时返回elasticsearch对象,即: es = Elastic()
然后我可以使用它来执行现有的elasticsearch类方法和我自己的自定义操作,例如:
es.search() # existing class method
es.custom_method_example1() # new class method
我一直在尝试,但没有想出一个方法来做到这一点-我最近的尝试涉及使用 __new__
dunder方法,以便返回连接的 es
对象作为新类:
class Elastic(Elasticsearch):
def __new__(cls, timeout=10, max_retries=5, retry_on_timeout=True, *args,**kwargs):
"Connect to our ES server."
return Elasticsearch([{'host': 'XXXXX', 'port': XXXX}], timeout=10, max_retries=5, retry_on_timeout=True, *args,**kwargs)
def custom_method_example1(self, *args,**kwargs):
"""
Performs some custom method that wasn't possible with the standalone Elasticsearch class
"""
首先它不起作用: AttributeError: 'Elasticsearch' object has no attribute 'custom_method_example1'
,似乎不再继承而是替换类?
第二,我从阅读中了解到 __new__
通常没有太多的用处(特别是对于像我这样的业余程序员),所以我可能采取了错误的方法/在这里过于复杂。如果有人知道“正确”的方法来做这件事,这将是非常感谢-我已经读了一些关于工厂设计,这似乎是正确的方式去一般,但我仍然有意义的一切(我是一个分析师的贸易)。我想装饰师可能会在某个地方使用??
谢谢,抱歉给你华夫饼
1条答案
按热度按时间byqmnocz1#
事实上,我把它搞得太复杂了。没有考虑类继承涉及构造函数本身的继承-因此我可以调用子类
Elastic
就像我对父母一样Elasticsearch
:初始化类并调用其方法:
edit:我仍然有一个问题,就是想为我的子类构造函数设置新的默认参数-我现在已经知道如何使用
super()
它显式调用父构造函数,传递我在子类构造函数中设置的参数,给我留下:允许我这样初始化类: