python - 如何在类方法中引用对象而不将其作为参数传递?
问题描述
我正在编写一个模块,以使对与工作相关的网站的请求更容易。我有一个初始化会话并将 URL 作为变量的类。我编写了一个抽象类来封装请求的逻辑,并为每种数据类型编写了一个子类。理想情况下,大多数方法应该是类方法,所以我可以通过写来调用它们module.subclass1.get(params)
。我的问题是所有这些方法都需要一个会话和一个 URL 来发出请求,我想不出一个好的方法来实现它。我的代码目前看起来像这样。
#This class I make an instance of, to have the session and url at hand.
class Website:
def __init__(self, username, password, url):
self.session = getSession(username, password)
self.url = url
#The abstract class that handles the requests
class AbstractClass(abc.ABC):
classvar1 = ""
classvar2 = ""
@classmethod
def get(cls, website, params):
website.session.get(website.url + cls.classvar1, params)
class Subclass1(AbstractClass):
classvar1 = "Something else"
classvar2 = "Something else"
我的一些(次优)解决方案是:
1. 将网站实例作为参数传递给类方法
这可行,这就是我现在所做的,但我必须一直将网站对象作为参数传递。
所有的调用最终都会是这样的:
module.subclass1.method(website, params)
2. 使网站对象成为抽象类中的类变量。
这很有效,并且使方法调用看起来很漂亮: module.Subclass1.get(params)
但这似乎是非常糟糕的做法,我希望始终必须指定用户名、密码和 URL,因此不同的脚本可以使用不同的登录名,因此我可以将 URL 更改为测试或生产环境。
3.在Website类中用一个网站对象初始化所有子类
这也使方法调用看起来很漂亮website.Subclass1.method(params)
,但是我必须初始化 Website 方法中的每个子类__init__
,并且必须更改抽象类以添加一个__init__
将 Website 对象作为参数的方法。
有没有更聪明的方法来做到这一点?任何帮助深表感谢。
解决方案
推荐阅读
- python - 获取数字列表的更快方法
- wordpress - 我可以在哪里编辑似乎不在代码中的 wordpress 文本?
- ruby-on-rails - 我无法在我的 Rails 应用程序中创建 manifest.json
- wordpress - Wordpress 回显或获取除最后 6 个字符外的单个帖子标题
- mongodb - 如何在 F# 中对 Mongo 集合进行排序
- javascript - 获取符号名称
- asp.net-mvc - 问题添加涉及在 ASP.NET MVC 5 中使用实体框架代码优先引用 ApplicationUser 的实体的迁移
- java - jlink 打包当前平台的二进制文件
- python-3.x - 在Python中在偶数x轴上不均匀地绘制多个箱形图
- android - 了解 Flutter 依赖和 Build.gradle 关系