Python 2.7 __init__ поведение на себя - PullRequest
1 голос
/ 08 ноября 2010

У меня есть вопрос по питону, который, я уверен, довольно прост - пожалуйста, не стесняйтесь отвлекать меня от любой плохой практики, пока вы на ней.У меня есть следующий код:

class User(dict,BaseDBI):
    def __init__(self,uid=None,username=None):
        self['uid']=str(uuid())     
        if uid == None and username is not None:            
            uid_struct = self.Get('data/username.kch',username)         
            if uid_struct is not None:
                self = self.Get('data/user.kch',uid_struct['uid'])

Как вы можете сказать, этот пользователь просто расширенный объект dict.Он также обращается к нескольким простым методам Get и Set для пары файлов базы данных Kyoto Cabinet.Я вставил несколько операторов печати, чтобы проследить, что происходит, и все устанавливается правильно, но когда я создаю объект User (например):

user = User(username='someusername')

, а затем печатаю пользователя, у меня появляется только новый объект dictс новым uid, сгенерированным первой строкой под __init__

Спасибо за любую мудрость!

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

переменные python являются ссылками.когда вы присваиваете self, вы заменяете эту ссылку, но не изменяете объект, который возвращается __init__.

. Самый простой способ - просто использовать метод dict.update для копирования всех ключейпары значений в self.Это должно «просто работать», поскольку вы уже наследуете от dict.

Наследование подходит только для таких отношений, как A is a B.Вы указываете, что пользователь является диктатом, это нормально, но я сомневаюсь, что пользователь является BaseDBI.Скорее всего, вы хотите, чтобы пользователь имел базу данных, и в этом случае состав будет более подходящим.Это, вероятно, кажется придирчивым, но мешает вам создавать странные и непристойные системы.

0 голосов
/ 08 ноября 2010

Если вам нужно вернуть уже существующий экземпляр или ваш класс, вам нужно определить __new__ метод

К моменту вызова __init__ уже создан новый экземпляр

0 голосов
/ 08 ноября 2010

Вам нужно вызвать унаследованные конструкторы. Что-то вроде:

def __init__(self,uid=None,username=None):
    dict.__init__(self)
    BaseDBI.__init__(self)

Также присвоение self просто заменит значение в локальной переменной self. Это не повлияет на объект.

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