Не нарушены ли свойства Python? - PullRequest
3 голосов
/ 17 марта 2010

Как может быть, что этот тестовый пример

import unittest

class PropTest(unittest.TestCase):
    def test(self):
        class C():
            val = 'initial val'

            def get_p(self):
                return self.val

            def set_p(self, prop):
                if prop == 'legal val':
                    self.val = prop

            prop=property(fget=get_p, fset=set_p)

        c=C()
        self.assertEqual('initial val', c.prop)

        c.prop='legal val'
        self.assertEqual('legal val', c.prop)

        c.prop='illegal val'
        self.assertNotEqual('illegal val', c.prop)

терпит неудачу, как показано ниже?

Failure
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 279, in run
    testMethod()
  File "/Users/jacob/aau/admissions_proj/admissions/plain_old_unit_tests.py", line 24, in test
    self.assertNotEqual('illegal val', c.prop)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 358, in failIfEqual
    (msg or '%r == %r' % (first, second))
AssertionError: 'illegal val' == 'illegal val'

1 Ответ

13 голосов
/ 17 марта 2010

Ваш класс C не наследуется от object или любого другого класса нового стиля, поэтому он является классом старого стиля (и поэтому не поддерживает свойства). Дескрипторы только для классов нового стиля. Чтобы исправить, измените class C() на class C(object).

http://www.python.org/download/releases/2.2.3/descrintro/ предоставляет некоторые детали, если вы заинтересованы. Классы нового стиля лучше в нескольких отношениях.

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