Albert-Jan Roskam wrote: > > > ----- Original Message ----- > >> From: Peter Otten <__pete...@web.de> >> To: python-list@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.
But that's what you are doing, you just spell it differently. > 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. I think you are misunderstanding what I was trying to say; so to be explicit: >>> class Employee: pass ... >>> sys.getsizeof(Employee) 976 i. e. you have a per-class and per-instance memory consumption. The latter is smaller, so with regards to memory consumption instantiating only pays off when there is more than one employee. -- https://mail.python.org/mailman/listinfo/python-list