Python - 传递对象引用?

1 投票
2 回答
1658 浏览
提问于 2025-04-16 00:33

我正在学习Python(之前是用dotnet),并开发一个与网络服务互动的应用。

这个网络服务比较简单,有很多调用,其中一些是和会话相关的,比如登录等,而其他的调用则是用来获取或设置业务数据。

为了配合这个网络服务,有几个Python类封装了所有的调用。我想在这个类的基础上开发一个客户端,但希望给客户端更多面向对象的结构。

我自己应用的设计是有一个会话类型的类,负责登录和保持连接等功能,而这个类会被注入到一个业务类型的类中,后者负责进行所有的业务调用。

所以整个结构大概是这样的:

WebService          (Soap)   
 WebServiceWrapper  (Python)
  Session           (Python)
   Business         (Python)

这里是我的代码示例(我重命名了一些方法,以便让内容更清晰)

from webServiceWrapper import webServiceAPI

class Session():
    def __init__(self, user, password):
        self._api = webServiceAPI()
        self.login = self._api.login(user, password) 

    def webServiceCalls(self):
        return self._api()

class Business():
    def __init__(self, service):
        self._service=service

    def getBusinessData(self):
        return self._service.get_business_data()

还有我的单元测试

class exchange(unittest.TestCase):
    def setUp(self):
        self.service = Session("username","password")
        self._business = Business(self.service.webServiceCalls())

    def testBusinessReturnsData(self):
        self.assertFalse(self._business.getBusinessData()==None)

单元测试在这里失败了

return self._api() 

提示说底层类不可调用

TypeError: 'webServiceAPI' is not callable

我第一个问题是,这样做是Python的方式吗?用静态语言开发应用时的面向对象思维在动态语言中也适用吗?(这可能是个大问题!)

我的第二个问题是,如果这种架构是可以的,那我做错了什么(我想是在以这种方式传递对象引用时)?

非常感谢

S

2 个回答

1

我觉得这里没有什么问题,也没有不符合Python风格的地方。Python的爱好者们常常会提到它和静态语言(比如Java或C#)的不同,但在很多实际应用中,Python也常常使用简单的静态类设计。

我猜webServiceAPI不是一个类,所以不能被调用。

如果你在使用Python 2.x版本,记得一定要从object类型继承,否则你会得到一个“经典类”(这是个古老的遗留概念,为了兼容性而保留)。

3

如果WebserviceAPI是一个对象,那就把括号去掉,像这样:

return self._api 

你在构造函数里已经创建了这个对象的实例。

也许可以在问题里加上WebserviceAPI的定义,因为现在我只能猜测。

撰写回答