我正在努力理解使用实例方法而不是静态方法是有意义的。另外,我不知道我的功能是否是静态的,因为没有@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_url
和web_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
类,因为您就像其他名称空间一样使用它。您没有任何要保存的"状态",无论是在课堂或类实例中。
似乎是一件好事是拥有单独的模块并在其中定义了这些功能。这样,在导入此模块时,您就可以拥有想要的名称空间。