2015-05-04 1 views
1

Я пытаюсь реализовать super() за this Ответьте так.Как пользователь super() в наследовании класса python

У меня есть следующий класс:

class Collection(): 
    """returns a collection curser from mongodb""" 
    def __init__(self, db, collection_name): 
     self.db = db 
     self.collection_name = collection_name 

     if not hasattr(self.__class__, 'client'): 
      self.__class__.client = MongoClient() 

     self.data_base = getattr(self.client, self.db) 
     self.collection = getattr(self.data_base, self.collection_name) 

и следующий подкласс:

class User(Collection): 
    def __init__(self, db, collection_name): 
     super(User, self).__init__(db, collection_name) 

Назвав Collection класс работает отлично:

agents = Collection('hkpr_restore','agents') 

Вызов подкласса:

user = User('hkpr_restore','agents') 

Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "main.py", line 37, in <module> 
    user = User('hkpr_restore','agents') 
    File "filepath/user.py", line 35, in __init__ 
    super(User, self).__init__(db, collection_name) 
TypeError: must be type, not classobj 

Что я делаю неправильно?

+0

Возможно, вы захотите сделать 'Collection.client = ...' вместо 'self .__ class __. Client = ...', чтобы каждый подкласс имел один и тот же клиент, и вы используете меньше соединений. Вы также можете использовать глобальное имя вместо атрибута класса. –

+0

Если вы используете Python 2, вы должны добавить тег Python 2 на свой вопрос. –

ответ

1

Наследуйте коллекцию от объекта, например Collection(object), чтобы создать новый класс стиля. Таким образом, супер будет работать (он работает только с новыми классами стилей).

+0

FWIW, все классы в Python 3 являются новыми, поэтому явно наследовать от 'object' не нужно в Python 3. OTOH, записывая' object' в Python 3, это не повредит, и, я думаю, приятно писать код, который правильно работает на обоих Py 2 и Py 3, где это целесообразно. –