Python - 传递对象引用?

时间:2010-06-29 08:34:02

标签: python oop

我学习Python(来自dotnet背景)并开发一个与web服务交互的应用程序。

网络服务是扁平的,因为它有许多呼叫,其中一些与会话相关,例如登录等,而其他调用与检索/设置业务数据有关。

为了配合web服务,有几个python类包含所有调用。我希望在该类之上开发一个客户端,但为客户端提供更多的OO结构。

我自己的应用程序的设计是有一个Session类型的类,负责登录/维护连接等,但是它本身会被注入一个Business类型的类,它负责进行所有的业务调用

所以堆栈就像

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

我的第一个问题是,是蟒蛇方式吗?用静态语言支持应用程序开发的OO思想是否也适用于动态? (这可能是一个很大的问题!)

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

很多thx

取值

2 个答案:

答案 0 :(得分:3)

如果WebserviceAPI是一个对象,只需删除括号:

return self._api 

您已在构造函数中创建了该对象的实例。

也许将WebserviceAPI的定义添加到问题中,我现在只能猜测。

答案 1 :(得分:1)

我在这里看不到任何错误或非Pythonic。 Pythonistas经常指出与Java或C#等静态语言的差异,但许多现实世界的应用程序大多也使用Python中的简单静态类设计。

我猜webServiceAPI不是一个类,因此无法调用它。

如果您使用的是Python 2.x,请始终从object类型继承,否则您将获得一个“经典类”(为了背景兼容性,保留了古代的遗留物)。