Sublassing tuple works, subclassing list does not

Rob Williscroft rtw at rtw.me.uk
Wed Mar 31 05:02:27 EDT 2010


Frank Millman wrote in news:mailman.1360.1270018159.23598.python-
list at python.org in comp.lang.python:

> I came up with a simple solution that seems to work -
> 
>>>> class MyTuple(tuple):
> ...   def __new__(cls, names, values):
> ...     for name, value in zip(names, values):
> ...       setattr(cls, name, value)
> ...     return tuple.__new__(cls, values)
> ...
>>>> names = ['A', 'B', 'C']
>>>> values = ['a', 'b', 'c']
>>>>
>>>> tup = MyTuple(names, values)
>>>>

Are you aware you are adding attributes to the class here, IOW:

    	MyTuple.C == 'c'

If you want to add attibutes to the instance:

class MyTuple(tuple):
  def __new__(cls, names, values):
    r =  tuple.__new__(cls, values)
    for name, value in zip(names, values):
      setattr(r, name, value)
    return r

names = ['A', 'B', 'C']
values = ['a', 'b', 'c']

tup = MyTuple(names, values)

assert tup[0] == 'a'
assert tup.B == 'b'

try:
  MyTuple.C
except AttributeError:
  pass
else:
  assert False






More information about the Python-list mailing list