Correct type for a simple "bag of attributes" namespace object

Albert-Jan Roskam fomcl at yahoo.com
Sun Aug 3 06:51:12 EDT 2014



----- Original Message -----

> From: Peter Otten <__peter__ at web.de>
> To: python-list at python.org
> Cc: 
> Sent: Sunday, August 3, 2014 11:37 AM
> Subject: Re: Correct type for a simple "bag of attributes" namespace object
> 
> Albert-Jan Roskam wrote:
> 
>>  I find the following obscure (to me at least) use of type() useful exactly
>>  for this "bag of attributes" use case:
>>>>>  employee = type("Employee", (object,), {})
>>>>>  employee.name = "John Doe"
>>>>>  employee.position = "Python programmer"
>>>>>  employee.name, employee.position, employee
>>  ('John Doe', 'Python programmer', <class 
> '__main__.Employee'>)
> 
> Are you sure you know what you are doing? The above is equivalent to
> 
>>>>  class employee:
> ...     name = "John Doe"
> ...     position = "Python programmer"
> ... 
>>>>  employee.name, employee.position, employee
> ('John Doe', 'Python programmer', <class 
> '__main__.employee'>)
>>>>  type(employee)
> <class 'type'>
> 
> Basically you are using classes as instances. While there is no fundamental 
> difference between classes and instances in Python you'll surprise readers 
> of your code and waste some space:

Yes, I know that it is equivalent, but I have always found it kind of ugly to use class() just to bundle a number of items. Like you are 'announcing OOP' (not sure how to put this into words), and then it's merely a simple bundle. Or maybe it's just me being silly, because it's even in the Python tutorial: https://docs.python.org/2/tutorial/classes.html#odds-and-ends
 
>>>>  import sys
>>>>  sys.getsizeof(employee)
> 976
>>>>  class Employee: pass
> ... 
>>>>  employee = Employee()
>>>>  employee.name = "John Doe"
>>>>  employee.position = "Python programmer"
>>>>  sys.getsizeof(employee)
> 64
Wow, I was not aware of that at all. So they are not equivalent after all. 



More information about the Python-list mailing list