我有一个小型库,我可以从网站获取一些数据,然后将其序列化。
我知道正确的开发方式是采用依赖注入的原理。在我的代码中有一个特定的基类,其中包含所有可用的方法。
class MyClass:
def __init__(self):
self.my_http_connection = HttpConnection()
def my_method(self):
return self.my_http_connection.get("address")
library = MyClass()
library.my_method()
在构造函数中,我创建了一个实例HttpConnection
,事实上,我还有更多这样的实例,它们负责完全不同的情况。例如,哈希类。
以这种方式在构造函数中初始化类是否正确?这是好的做法吗?我阅读了 redis-py 和 aiogram 的源代码,这些东西是以完全不同的方式实现的。例如,aiogram 库中的任何方法都是通过__call__
.有条件地
async def send_message(self):
call = SendMessage()
await self(call)
正因为如此,我不知道应该朝哪个方向去了解如何编写好的代码。
upd:我忘了提及我也分担课程的责任。我不会在一堂课上完成数学、http 请求和数据库工作。一个真实的例子如下所示:
class Explorer:
def __init__(self, connection: Http):
self.conn = connection
def get(url):
return self.conn.get(url)
class MyClass:
def __init__(self):
self.my_http_connection = Http()
self.serializer = Serializer()
self.explorer = Explorer(self.my_http_connection)
def my_method(self):
return self.serializer.serialize(self.explorer.get("address"))
library = MyClass()
library.my_method()
这就是我实现几乎所有代码的方式。而在explorer类中,以此类推,可能还有另一个类负责某事等等。
其实按照你的例子使用是没有问题的。有些直接在构造函数中创建实例,而另一些(例如httpx库)则使用工厂方法:
之后,类将看起来类似:
没有任何限制;例如,在FastAPI中,所有内容都像您一样在构造函数中初始化。