何时使用实例与静态方法



我正在努力理解使用实例方法而不是静态方法是有意义的。另外,我不知道我的功能是否是静态的,因为没有@staticmethod装饰器。当我打电话给其中一种方法时,我可以访问类功能吗?

我正在研究将信息发送到数据库的网络纵行。这是每周运行一次的设置。我的代码的结构看起来像这样

import libraries...
class Get:
    def build_url(url_paramater1, url_parameter2, request_date):
        return url_with_parameters
    def web_data(request_date, url_parameter1, url_parameter2): #no use of self
        # using parameters pull the variables to look up in the database
        for a in db_info:
            url = build_url(a, url_parameter2, request_date)
            x = requests.Session().get(url, proxies).json()
            #save data to the database
        return None
    #same type of function for pulling the web data from the database and parsing it
if __name__ == ‘__main__’:
    Get.web_data(request_date, url_parameter1, url_parameter2)
    Parse.web_data(get_date, parameter) #to illustrate the second part of the scrapper

这是基本结构。该代码是功能性的,但我不知道我是否正在正确使用这些方法(功能?(,并且可能会错过将来使用代码的方法。我什至可能正在编写错误的代码,这会导致错误的错误,而这仅仅是因为我没有遵循最佳实践,因此很难进行调试。

阅读了何时使用类和实例方法后。我看不出为什么会使用它们。如果我想要构建的URL或从网站上删除的数据,我将称为build_url或get_web_data函数。我不需要该功能的实例来跟踪任何分开的内容。我无法想象我何时需要将某些东西分开,这是我认为是问题的一部分。

我认为我的问题与以前的问题不同的原因是:解释差异的概念示例在我坐下来编写代码时似乎对我没有帮助。我尚未遇到用不同方法来解决的现实世界问题,这些方法什至应该使用实例方法,但是在查看代码的概念示例时,实例方法似乎是必须的。

谢谢!

类可以用来表示对象,也可以在一个共同名称空间下进行分组函数。

当类代表对象(例如猫(,从逻辑上讲,"可以做"的任何事物都应该是一种实例方法,例如Meowing。

但是,当您拥有一组静态功能相互关联或通常一起使用以实现共同目标(例如build_urlweb_data(时,您可以通过将它们放在静态下使代码更清晰,更有条理班级,提供一个像您一样的共同名称空间。

因此,我认为您选择的结构是合法的。不过,值得考虑的是,您会在更明确地发现静态类,例如Java,而在Python中,将模块用于名称空间分离更为常见。

您在代码中写的功能是实例方法,但它们是错误编写的。实例方法必须self作为第一个参数

def build_url(self, url_paramater1, url_parameter2, request_date):

然后您称其为

get_inst = Get()
get_inst.build_url(url_paramater1, url_parameter2, request_date)

self参数由Python提供,它允许您访问Get类的所有属性和函数 - 静态或不静态。

如果您不需要访问类中的其他功能或属性,则添加@staticmethod Decorator并删除self参数

@staticmethod
def build_url(url_paramater1, url_parameter2, request_date):

,然后您可以直接称呼它

Get.build_url(url_paramater1, url_parameter2, request_date)

或从类实例打电话

get_inst = Get()
get_inst.build_url(url_paramater1, url_parameter2, request_date)

但是您可能会问的当前代码有什么问题?尝试从这样的实例调用它,您会看到问题

get_inst = Get()
get_inst.build_url(url_paramater1, url_parameter2, request_date)

创建实例很有用的示例:假设您想成为聊天客户端。

您可以像这样编写代码

class Chat:
    def send(server_url, message):
        connection = connect(server_url)
        connection.write(message)
        connection.close()
    def read(server_url):
        connection = connect(server_url)
        message = connection.read()
        connection.close()
        return message

,但这是一种更干净,更好的方法:

class Chat:
    def __init__(server_url):
        # Initialize connection only once when instance is created
        self.connection = connect(server_url)
    def __del__()
        # Close connection only once when instance is deleted
        self.connection.close()
    def send(self, message):
        self.connection.write(message)
    def read(self):
        return self.connection.read()

要使用最后一堂课

# Create new instance and pass server_url as argument
chat = Chat("http://example.com/chat")
chat.send("Hello")
chat.read()
# deleting chat causes __del__ function to be called and connection be closed
delete chat

此代码根本不需要一个类。它应该只是一对功能。您看不出为什么需要实例方法,因为您没有理由首先实例化对象。

从给定的示例中,毕竟无需拥有Get类,因为您就像其他名称空间一样使用它。您没有任何要保存的"状态",无论是在课堂或类实例中。

似乎是一件好事是拥有单独的模块并在其中定义了这些功能。这样,在导入此模块时,您就可以拥有想要的名称空间。

最新更新