Create and Object With Namedtuple
Namedtuples are a subclass of typename which allow us to create objects (or classes) with tuple-like attributes, it’s easy to create a class with immutable attributes with this library.
Creating an object
To create a namedtuple we only need the name of the class first and then the attribute list.from collections import namedtuple
Person = namedtuple('Person', 'name job_position sex married')
john = Person('john', 'developer', 'male', False)
john
Person(name='john', job_position='developer', sex='male', married=False)
Be aware that you can pass an argument list as a string (‘att1 att2’), as an actual list ([‘att1’, ‘att2’]) or a string with comma separated values (‘att1, att2’).
Accessing attributes
We can access the person attributes just like any other class.john.name
'john'
john.job_position
'developer'
john.sex
'male'
john.married
False
Docstring
We can also assign docstring to our attributes.Person.__doc__ = 'A person attributes'
'A person attributes'
Person.name.__doc__ = "A person's name"
"A person's name"
Person.job_position.__doc__ = "A person's job position"
"A person's job position"
Person.sex.__doc__ = 'Yes'
'Yes'
Person.married.__doc__ = 'Is the person married?'
'Is the person married?'
Changing values
As our attribute are tuples we cannot change these attributes.john.name = 'Johnny'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
But we can copy the class with the new values.johnny = john._replace(name='johnny', married=True)
johnny
Person(name='johnny', job_position='developer', sex='male', married=True)
Convert a Dictionary to a Class
Using the same class Person that we defined above.d = {'name': 'john', 'job_position': 'developer', 'sex': 'male', 'married': False}
john = Person(**d)
john