faulkner a écrit : (please, don't top-post - corrected) > > Miguel Galves wrote: > >>Hello, >> >>I`m starting to learn python, and I hava a very good background in Java >>and C/C++ programming. I was reading Dive into python chapter about >>OO and I saw that in python we can do the following: >> >>class Person:
Do yourself a favor : use new-style classes class Person(object): >> pass >> >>joe = new Person() joe = Person() No 'new' keyword needed - Python classes are callable objects acting as factory. >>joe.name = "Joe" >>joe.age = 13 >> >>It seems that it is possible to add attributes to any object instance >>in run time, as in Javascript. Yes, unless you used __slots__ in your class. >> It seems to me that it can be a source >>of errors. Almost never happened to me in 7+ years of Python programming. > One that come in my mind is the follwing: >> >>class Person: >> name = "" This creates a class attribute (ie: shared by all instances of the class). For an instance attribute, you want this: class Person(object): def __init__(self, name="") self.name = name >>joe = new Person() >>joe.nome = "Joe" >> >>The code above adds an attribute called nome, but the programmer may think >>it's name. Then he haven't read it's code !-) >>What is the real interest of this feature ? Doing things you can't even dream of in Java or C++. Now if this scares you, what about dynamically adding/replacing a method to/of a whole class or on a per-instance basis, or changing the class of an object at runtime ?-) > Is there a way to block this >>kind of error ? If you're serious, you use automated unit tests, and you'll notice the error pretty quickly. Even if you don't use automated unit-tests, the test/code cycle in Python is so fast that you'll still notice the problem pretty soon. And also, there are tools like pylint that may help you catch a lot of typos. Now in practice, I can assure you this is nothing to worry about. Since Python doesn't get in the way, one usually stay very focused on the actual code being written instead of fighting with boiler-plate. > when you set an attribute of an object, python secretly calls that > objects __setattr__ method. > class test: *please* use new-style classes. > def __setattr__(self, attr_name, attr_value): > print self, attr_name, attr_value stdout is for normal program outputs. Trace etc should go either to a log and/or to stderr. > self.__dict__[attr_name] = attr_value # do what the original > __setattr__ method does. And ? How will this "block this kind of error" ? Are you suggesting to test for names in __setattr__ ? This would be totally stupid IMHO. Python *is* dynamic. period. Better to go with the language than to try to force it into a brain-dead mockup of Java. -- http://mail.python.org/mailman/listinfo/python-list