See the following code to understand what I mean by read-only
attributes. In the Circle class, the diameter is
setted in setRadius and we don't want a user can change
its value directly. It is what is checked in def test_readonly(self).
# --
# Copyright (C) CEA, EDF
# Author : Erwan ADAM (CEA)
# --
import unittest
from xdata import *
class Circle(XNamedObject):
__init__xattributes__ = [
XAttribute("radius", xtype=XFloat(open_min=0.0)),
]
__object__xattributes__ = [
XAttribute("diameter", xtype=XFloat(open_min=0.0)),
XAttribute("test_init", xtype=XFloat(open_min=0.0)),
XAttribute("test_method", xtype=XFloat(open_min=0.0)),
]
def __init__(self, *args, **kwargs):
self.test_init = 1.0
return
def setRadius(self, value):
self.diameter = 2*self.radius
return
def method(self):
self.test_method = 1.0
return
pass
class CircleTestCase(unittest.TestCase):
def test(self):
c = Circle(1.0)
self.failUnlessEqual(c.radius, 1.0)
self.failUnlessEqual(c.diameter, 2.0)
c.setRadius(2.0)
self.failUnlessEqual(c.getRadius(), 2.0)
self.failUnlessEqual(c.getDiameter(), 4.0)
return
def test_readonly(self):
c = Circle(1.0)
self.failUnlessRaises(AttributeError, c.setDiameter, 2.0)
self.failUnlessRaises(AttributeError, c.__setattr__, "diameter", 2.0)
self.failUnlessRaises(AttributeError, setattr, c, "diameter", 2.0)
#
c.method()
return
pass
if __name__ == '__main__':
unittest.main()
pass