Использование методов одного класса из другого в python - PullRequest
0 голосов
/ 08 августа 2011

Я работаю через 'Dive Into Python' в Google App Engine и столкнулся с этой ошибкой, пытаясь вызвать методы одного класса из другого:

ERROR __init__.py:463] create() takes exactly 1 argument (2 given)
Traceback (most recent call last):
  File "main.py", line 35, in get
    dal.create("sample-data");
  File "dataAccess/dal.py", line 27, in create
    self.data_store.create(data_dictionary);
TypeError: create() takes exactly 1 argument (2 given)

Вот мой основной класс:

# filename: main.py

from dataAccess.dal import DataAccess

class MySampleRequestHandler(webapp.RequestHandler):
"""Configured to be invoked for a specific GET request"""

    def get(self):
        dal = DataAccess();
        dal.create("sample-data"); # problem area

MySampleRequestHandler.get() пытается создать экземпляр и вызвать DataAccess, который определяется в другом месте, где:

# filename: dal.py

from dataAccess.datastore import StandardDataStore

class DataAccess:
    """Class responsible for wrapping the specific data store"""

    def __init__(self):
        self.data_store = None;

        data_store_setting = config.SETTINGS['data_store_name'];                
        if data_store_setting == DataStoreTypes.SOME_CONFIG:
            self.data_store = StandardDataStore();

        logging.info("DataAccess init completed.");

    def create(self, data_dictionary):
        # Trying to access the data_store attribute declared in __init__
        data_store.create(data_dictionary);

Я думал, что мог бы вызвать DataAccess.create() с 1 параметром в качестве аргумента, особенно в соответствии с тем, как Dive into Python отмечает о вызовах методов класса:

При определении методов класса вы должны явно указать self как первый аргумент для каждого метода, включая __init__. Когда вы вызываете метод класс предка из вашего класса, вы должны включить аргумент self. Но когда вы вызываете ваш метод класса извне, вы ничего не указываете для аргумента себя; Вы пропускаете это полностью, и Python автоматически добавляет ссылка на экземпляр для вас.

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

В self.data_store.create(data_dictionary) self.data_store относится к объекту, созданному self.data_store = StandardDataStore() в методе __init__.

Похоже, что метод create объекта StandardDataStore не делаетНе ожидайте дополнительного аргумента.

1 голос
/ 08 августа 2011

должно быть self.data_store.create(data_dictionary);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...