首页 > 解决方案 > 如何在类方法中引用对象而不将其作为参数传递?

问题描述

我正在编写一个模块,以使对与工作相关的网站的请求更容易。我有一个初始化会话并将 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

解决方案


推荐阅读