On May 21, 9:49 pm, "wang frank" <[EMAIL PROTECTED]> wrote: > Hi, > > I am trying to write a python class with a new data type such as: > class Cc14: > def __init__(self, realpart, imagpart): > self.r=realart > self.i=imagpart > > def __saturator(x): > return x+1 > def out(self,x): > return Cc14(__saturator(x.r), __saturator(x,i)) > > When I use the method out such as: > z.out > > Python complains: > > global name '_Cc14_saturator' is not defined. > > Is the way put two underscore in front of the definitio making the method > becomes private? > > Why in the same clase, I could not use the __saturator method? > > Thanks > > Frank >
It seems you have several issues here: (1) To avoid syntax errors, self.r=realart should be: self.r=realpart (2) Your __saturator method definition needs the reference to self: def __saturator(self, x): (3) And lastly, the body of the out() method needs two corrections: return Cc14(self.__saturator(x.r), self.__saturator(x.i)) Is it really necessary to "privatize" the saturator method? In Python, all class methods are public and visible by default. A method name __methodname in a class "foo" turns into "_foo__methodname" in an instance of the class. This is known as name mangling. It is simply a convention supported by Python when a class attribute name begins with two underscores. It prevents a programmer from calling something like C.__saturator(arg), but still allows calling C._Cc14__saturator(arg). IMHO, you could just leave the saturator definition as "def saturator(self, x):" Anyway, in your case the 3 fixes above will allow you now to do this: >>>C = Cc14(2,3) >>>result = C.out(C) >>>result.r, result.i (3, 4) Which is beginning to look like your design intent.. Cheers, -Basilisk96 -- http://mail.python.org/mailman/listinfo/python-list