"Steven D'Aprano" <[EMAIL PROTECTED]> wrote: > I'm not sure how to do this, or where to start looking for the right > information, so any advice would be appreciated. > > I want to implement a class with two (or more) different ways of looking > at its attributes. > > One example of this might be complex numbers, which can be written in > Cartesian form (x+yi) or polar form (r cis theta). > > (Yes, I know Python already has complex numbers. That was just an example.) > > Another might be 3D vectors, which can be written in Cartesian form > [x, y, z], polar form [r, theta, z] or spherical polar [r, theta, phi]. > > It is important that there are no privileged attributes, e.g. in the > above example, I can set any of x, y, z, r, theta or phi and all the > others will automatically reflect the changes. A concrete, if simple, > example will make it clear. > > Suppose I have a transformation (a,b) <-> (x,y) where: > > x = a+b > y = a+2*b > > I create an instance spam, and set a and b: > > spam.a = 1 > spam.b = 2 > > Now I should be able to read x and y: > > print spam.x, spam.y > # prints 3 5 > > If I set attribute y: > > spam.y = 0 > > a and b automatically change to match: > > print spam.a, spam.b > # prints 6, -3 > > > Anyone have any good ideas for how I should implement this?
As others have replied, properties is the way to go. There have been a few recipes in the Cookbook that avoid cluttering the class namespace with temporary get/set/del methods, e.g. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/410698. HTH, George -- http://mail.python.org/mailman/listinfo/python-list