使用elasticsearch服务器连接的python类继承

jvlzgdj9  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(319)

我正在尝试创建一个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__ 通常没有太多的用处(特别是对于像我这样的业余程序员),所以我可能采取了错误的方法/在这里过于复杂。如果有人知道“正确”的方法来做这件事,这将是非常感谢-我已经读了一些关于工厂设计,这似乎是正确的方式去一般,但我仍然有意义的一切(我是一个分析师的贸易)。我想装饰师可能会在某个地方使用??
谢谢,抱歉给你华夫饼

byqmnocz

byqmnocz1#

事实上,我把它搞得太复杂了。没有考虑类继承涉及构造函数本身的继承-因此我可以调用子类 Elastic 就像我对父母一样 Elasticsearch :

from elasticsearch import Elasticsearch

class Elastic(Elasticsearch):

    def custom_method_example1(self, *args,**kwargs):
        """
        Performs some custom method that wasn't possible with the standalone Elasticsearch class
        """

初始化类并调用其方法:

es = Elastic([{'host': 'XXXXX', 'port': XXXX}], timeout=10, max_retries=5, retry_on_timeout=True)

es.custom_method_example1()

edit:我仍然有一个问题,就是想为我的子类构造函数设置新的默认参数-我现在已经知道如何使用 super() 它显式调用父构造函数,传递我在子类构造函数中设置的参数,给我留下:

from elasticsearch import Elasticsearch

class Elastic(Elasticsearch):
    def __init__(self, hosts=[{'host':'XXXXXX', 'port':XXX}], timeout=10, max_retries=5, retry_on_timeout=True):
        super().__init__(hosts=hosts,timeout=timeout,max_retries=max_retries,retry_on_timeout=retry_on_timeout)  

    def custom_method_example1(self, *args,**kwargs):
        """
        Performs some custom method that wasn't possible with the standalone Elasticsearch class
        """

允许我这样初始化类:

es = Elastic()

相关问题