When you call c3.createJoe(c1.fred), you are passing a copy of the value stored in c1.fred to your function. Python passes function parameters by value. The function will not destructively modify its arguments; you must expliticly state your intention to modify an object:
class one(): fred = 'fred' class three(): def createJoe(self, myName): return "Joe" def main(): c1 = one() c3 = three() c1.fred = c3.createJoe() # Modify c1's attribute, fred, with the return value from c3.createJoe -- http://mail.python.org/mailman/listinfo/python-list