Проблема с вложенными объектами Python, хранящимися в словаре - PullRequest
0 голосов
/ 21 мая 2011

У меня возникли проблемы с изменением значения класса во время выполнения, а затем создания его экземпляра в виде объекта, затем сохранения этого объекта внутри другого класса и помещения его в словарь Python.

Вот небольшой фрагмент кода, который я написал для иллюстрации проблемы:

import unittest

class cls1(object):

    def __init__(self, obj):
        self.obj = obj

class cls2(object):

    def __init__(self):
        self.var = 1


class Testdict(unittest.TestCase):

    def __init__(self):
        self.objs = dict()

    def runTest(self):
        obj2 = cls2()
        obj1 = cls1(cls2())

        self.objs["test1"] = obj1

        self.assertEqual(self.objs["test1"].obj.var, 1)

        cls2.var = 2
        self.assertEqual(cls2.var, 2)
        obj1 = cls1(cls2())

        self.objs["test2"] = obj1

        self.assertEqual(self.objs["test1"].obj.var, 1)
        self.assertEqual(self.objs["test2"].obj.var, 2)

if __name__ == "__main__":
    d = Testdict()
    d.runTest()

Почему бы cls2 не создать экземпляр с его var равным 2?

Надеюсь, в этом вопросе есть смысл.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

То, что вы показываете, не может работать.Всегда.

class Cls2(object):
    def __init__(self):
        self.var = 1

Это переменная экземпляра.Это не переменная класса.Вы не можете получить доступ к .var с помощью Cls2.var Эта переменная существует только в каждом уникальном экземпляре класса.

        Cls2.var = 2

Не изменяет переменную self.var экземпляра.Это создаст новую переменную класса в Cls2 классе.

Вам нужно будет сделать что-то вроде этого.

class Cls2(object):
    default= 1
    def __init__(self):
        self.var = Cls2.default

Теперь вы можете сделать

Cls2.default= 2

И все остальное, что вы делаете, должно работать.

0 голосов
/ 21 мая 2011

Ваш тест будет работать, если cls2 не перезаписывает cls.var при его создании.

Попробуйте это:

class cls2(object):

    def __init__(self):
      try:
        self.var
      except:
        self.var = 1

Оператор try просто проверяет, установлен ли вы уже var.

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