2010-03-17 103 views
3

怎麼會是這個測試用例Python屬性是否被破壞?

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' 
+0

重複:http://stackoverflow.com/questions/2240351/python-2-6-4-property-decorators-not-working – 2010-03-17 04:07:12

+0

這是一個合理的批評,當您嘗試使用'屬性錯誤消息太爛'但忘了新式類/必須從* Object *繼承。 IDE可以抓住這個。 – smci

回答

13

C類不從object或任何其他新型類的繼承,所以它是一個老樣式類(因此不支持的屬性)。描述符僅適用於新式類。要修復,請將class C()更改爲class C(object)

http://www.python.org/download/releases/2.2.3/descrintro/提供了一些細節,如果你有興趣。新式課程在幾個方面更好。

+0

謝謝邁克。那很快。我剛剛在這裏也遇到了同樣的問題:http://stackoverflow.com/questions/2240351/python-2-6-4-property-decorators-not-working – Jacob