Karl Knechtel wrote:
On Thu, May 10, 2012 at 9:33 AM, Andreas Tawn <andreas.t...@ubisoft.com> wrote:
And there's also something like...
return "\n".join((": ".join((str(k), str(self.__dict__[k]))) for k in
self.__dict__))
which is a nice length, but I lose control of the order of the attributes and
the formatting is fixed. It also looks a bit too much like Lisp ;o)
Is there a better way?
If you don't care about being able to change the attributes
dynamically, define the `__slots__` of your class [...]
Firstly, __slots__ is a tuple.
Secondly, this is bad advice. __slots__ is there as a memory
optimization for classes that will have thousands of instances and do
not need the ability to have arbitrary attributes added after creation.
__slots__ is an advanced feature, and as such is easier to get wrong.
It is *not* there to make __str__ nor __repr__ easier to write.
8<-----------------------------------------------------------------------
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Test1(object):
... __slots__ = ('item', 'size')
... desc = 'class-only attribute'
...
>>> t1 = Test1()
>>> t1.desc = 'read-only attribute' # fails because 'desc' is
# not in __slots__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Test1' object attribute 'desc' is read-only
>>> print t1.item # fails because 'item' was
# not set
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: item
>>> class Test2(Test1):
... def __init__(self, price):
... self.price = price
...
>>> t2 = Test2(7.99) # __slots__ not defined in
# subclass, optimizations lost
>>> t2.oops = '__slots__ no longer active'
>>> print t2.oops
__slots__ no longer active
8<-----------------------------------------------------------------------
~Ethan~
--
http://mail.python.org/mailman/listinfo/python-list