【问题标题】:Are Python properties broken?Python属性是否损坏?
【发布时间】:2011-01-28 10:02:34
【问题描述】:

怎么会是这个测试用例

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'

【问题讨论】:

  • 这是一个合理的批评,当您尝试使用 property 但忘记了新样式类/必须从 Object 继承时,错误消息很糟糕。 IDE 可以赶上这个。

标签: python properties


【解决方案1】:

您的类C 不继承自object 或任何其他新样式类,因此它是旧样式类(因此不支持属性)。描述符仅适用于新式类。要修复,请将class C() 更改为class C(object)

http://www.python.org/download/releases/2.2.3/descrintro/ 提供了一些详细信息,如果您有兴趣。新型类在几个方面更好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-04-13
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2021-11-28
相关资源
最近更新 更多