2010-06-29 5 views
1

Я изучаю Python (исходящий из фона dotnet) и разрабатывая приложение, которое взаимодействует с веб-сервисом.Python - передача объектов ссылки?

Веб-сервис является плоским, поскольку он имеет множество вызовов, некоторые из которых связаны с сеансами, например. протоколирование и т. д., тогда как другие вызовы связаны с извлечением/настройкой бизнес-данных.

Для сопровождения веб-сервиса есть несколько классов python, которые переносят все вызовы. Я ищу, чтобы разработать клиента поверх этого класса, но придать клиенту больше структуры OO.

Дизайн моего собственного приложения состоял в том, чтобы иметь класс Session-type, который будет отвечать за ведение журнала/поддержание соединения и т. Д., Но сам будет введен в класс бизнес-класса, который несет ответственность за создание всего бизнеса звонки.

Так стек что-то вроде

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 

Моего первый д есть, что питон путь? Является ли мышление ОО, которое поддерживает развитие приложений со статическими языками, хорошо подходит и для динамических? (Это, вероятно, довольно большой q!)

Мой второй q заключается в том, что, если такая архитектура в порядке, что я делаю неправильно (я думаю, в терминах передачи ссылок на объекты таким образом)?

Многие ТНХ

S

+1

какой * есть * webServiceAPI?если python говорит, что не вызываемый, ну, что бы это ни было, он не может быть вызван – shylent

+0

Кажется, что ваш 'webServiceAPI' не определяет' __call__'. – kennytm

+2

также, вы должны взглянуть на руководство по стилю кода http://www.python.org/dev/peps/pep-0008/ и, предпочтительно, следовать ему – shylent

ответ

3

Если WebserviceAPI это объект просто удалить скобки так:

return self._api 

Вы уже создали экземпляр объекта в конструкторе.

Возможно, добавьте определение WebserviceAPI к вопросу, на который я могу только догадываться.

+0

Вот и все. Thx очень много. –

+0

Еще одна вещь, я не знаю, что делает WebserviceAPI, но это не похоже на то, что вам нужен экземпляр для каждого сеанса (вот что вы делаете сейчас). –

+0

Ну, WebServiceAPI.Logon возвращает токен, который мне нужно использовать во всех последующих вызовах веб-сервиса. Кроме того, WebServiceAPI обертывает (то, что я называю) бизнес-вызовы soap webservice. Итак, ISTM, либо мне нужно повторно создать экземпляр WebServiceAPI в классе «Мой бизнес» (пропуская маркер, который я получил при входе в систему), либо передаю ссылку на ранее созданный WebServiceAPI. Я бы предпочел передать экземпляр. Неправильно, если это правильно или нет. Pls может предложить лучший дизайн. –

1

Я не вижу ничего, что неправильно или непитоновский здесь. Pythonistas часто указывают на различия со статическими языками, такими как Java или C#, но многие приложения реального мира в основном используют простой статический класс в Python.

Я думаю, что webServiceAPI не является классом, поэтому его нельзя назвать.

Если вы используете Python 2.x, всегда наследуйте его от типа object, иначе вы получите «классический класс» (реликт с древних времен, который хранится для совместимости фона).

+0

.. много THX для этих комментариев. Я думаю, что я достаточно безопасен в области статического класса! Тем не менее, определение того, где этот вид дизайна (и различные шаблоны проектирования, которые его сопровождают), следует исключить, используя динамические и/или функциональные методы, где я очень шаткий! –

+0

Я видел только небольшую часть вашего класса и не могу судить по этому поводу, слишком ли статичен или нет. Я думаю, вы должны помнить, что статические конструкции сами по себе не ошибаются, только в некоторых случаях менее оптимальными. Единственный совет, который я могу предоставить банкомату, - это не использовать геттеры и сеттеры: все переменные-члены являются общедоступными в Python, поэтому инкапсуляция в стиле Java не работает и является излишней. – Philipp

+0

Thx again Philipp –

Смежные вопросы