我正在努力理解何时应该使用实例方法还是静态方法。另外,我不知道我的函数是否是静态的,因为没有@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函数。我不需要该函数的实例来跟踪任何单独的东西。我无法想象何时需要将某些东西分开,我认为这是问题的一部分。
我认为我的问题与之前的问题不同的原因是:当我坐下来编写代码时,解释差异的概念示例似乎对我没有帮助。我还没有遇到用各种方法解决的现实问题,这些方法显示了什至我什至应该使用实例方法,但是在查看概念性代码示例时,实例方法似乎是必需的。
谢谢!
解决方案
您在代码中编写的函数是实例方法,但是编写不正确。实例方法必须具有self第一个参数
即def build_url(self, url_paramater1, url_parameter2, request_date):
然后你这样称呼它
get_inst = Get()
get.build_url(url_paramater1, url_parameter2, request_date)
这个self参数是python提供的,它允许您访问类的所有属性和函数(静态或非静态)Get。
如果您不需要访问其他函数或函数中的属性,则可以添加@staticmethod装饰器并删除self参数
@staticmethod
def build_url(url_paramater1, url_parameter2, request_date):
然后您可以直接调用它
Get.build_url(url_paramater1, url_parameter2, request_date)
或从类实例中调用
get_inst = Get()
get.build_url(url_paramater1, url_parameter2, request_date)
但是您可能会问当前代码有什么问题?尝试从这样的实例调用它,您将看到问题
get_inst = Get()
get.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