When ‘super’ is not a good idea (was: 'Once' properties.)
Scott David Daniels writes: > Scott David Daniels wrote: > > class Initialized(ClassBase): > > @classmethod > > def _init_class(class_): > > class_.a, class_.b = 1, 2 > > super(Initialized, class_)._init_class() > > Mea culpa: Here super is _not_ a good idea, […] Why is ‘super’ not a good idea here? > class Initialized(ClassBase): > @classmethod > def _init_class(class_): > class_.a, class_.b = 1, 2 > ClassBase._init_class() What makes this implementation better than the one using ‘super’? -- \“I was once walking through the forest alone and a tree fell | `\ right in front of me, and I didn't hear it.” —Steven Wright | _o__) | Ben Finney -- http://mail.python.org/mailman/listinfo/python-list
Re: 'Once' properties.
Scott David Daniels wrote: ... Look into metaclasses: ... class Initialized(ClassBase): @classmethod def _init_class(class_): class_.a, class_.b = 1, 2 super(Initialized, class_)._init_class() Mea culpa: Here super is _not_ a good idea, and I had tried that and recoded, but cut and pasted the wrong code. I just noticed that I had done so this morning. class Initialized(ClassBase): @classmethod def _init_class(class_): class_.a, class_.b = 1, 2 ClassBase._init_class() print Initialized.a, Initialized.b Much better. There is probably a way to get to the MRO, but for now, this should do. --Scott David Daniels scott.dani...@acm.org -- http://mail.python.org/mailman/listinfo/python-list
Re: 'Once' properties.
menomnon wrote: Does python have a ‘once’ (per class) feature? ‘Once’, as I’ve know it is in Eiffel. May be in Java don’t. The first time you instantiate a given class into an object it constructs, say, a dictionary containing static information. In my case static is information that may change once a week at the most and there’s no need to be refreshing this data during a single running of the program (currently maybe 30 minutes). So you instantiate the same class into a second object, but instead of going to the databases again and recreating the same dictionary a second time, you get a pointer or reference to the one already created in the first object – copies into the second object that is. And the dictionary, no matter how many instances of the object you make, is always the same one from the first object. So, as we put it, once per class and not object. Saves on both time and space. Look into metaclasses: class MyType(type): def __new__(class_, name, bases, dct): result = type.__new__(class_, name, bases, dct) result._init_class() return result class ClassBase(object): __metaclass__ = MyType @classmethod def _init_class(class_): print 'initializing class' class Initialized(ClassBase): @classmethod def _init_class(class_): class_.a, class_.b = 1, 2 super(Initialized, class_)._init_class() print Initialized.a, Initialized.b --Scott David Daniels scott.dani...@acm.org -- http://mail.python.org/mailman/listinfo/python-list
Re: 'Once' properties.
On Oct 5, 11:07 pm, Carl Banks wrote: > On Oct 5, 7:56 pm, menomnon wrote: > > Does python have a ‘once’ (per class) feature? > > > ‘Once’, as I’ve know it is in Eiffel. May be in Java don’t. > > > The first time you instantiate a given class into an object it > > constructs, say, a dictionary containing static information. In my > > case static is information that may change once a week at the most and > > there’s no need to be refreshing this data during a single running of > > the program (currently maybe 30 minutes). > > > So you instantiate the same class into a second object, but instead of > > going to the databases again and recreating the same dictionary a > > second time, you get a pointer or reference to the one already created > > in the first object – copies into the second object that is. And the > > dictionary, no matter how many instances of the object you make, is > > always the same one from the first object. > > > So, as we put it, once per class and not object. > > > Saves on both time and space. > > Sounds like Borg Pattern: > > http://code.activestate.com/recipes/66531/ BTW, for your problem you'd probably want to add some kind of conditional initialization code: class Borg(object): _shared_state = { 'initialized' : False } def __init__(self): self.__dict__ = self._shared_state if self.initialized: return # perform initialization here self.initialized = True Carl Banks -- http://mail.python.org/mailman/listinfo/python-list
Re: 'Once' properties.
On Oct 5, 7:56 pm, menomnon wrote: > Does python have a ‘once’ (per class) feature? > > ‘Once’, as I’ve know it is in Eiffel. May be in Java don’t. > > The first time you instantiate a given class into an object it > constructs, say, a dictionary containing static information. In my > case static is information that may change once a week at the most and > there’s no need to be refreshing this data during a single running of > the program (currently maybe 30 minutes). > > So you instantiate the same class into a second object, but instead of > going to the databases again and recreating the same dictionary a > second time, you get a pointer or reference to the one already created > in the first object – copies into the second object that is. And the > dictionary, no matter how many instances of the object you make, is > always the same one from the first object. > > So, as we put it, once per class and not object. > > Saves on both time and space. Sounds like Borg Pattern: http://code.activestate.com/recipes/66531/ Carl Banks -- http://mail.python.org/mailman/listinfo/python-list
Re: 'Once' properties.
On Mon, Oct 5, 2009 at 7:56 PM, menomnon wrote: > Does python have a ‘once’ (per class) feature? In Python, `class` is an executable statement, so you can put whatever code you want in the class body (along with your method definitions) and it will be run exactly once, at the time the class is defined (that is, when the `class` statement is encountered by the interpreter). In this way, you could create class variables containing such static information. Cheers, Chris -- http://blog.rebertia.com -- http://mail.python.org/mailman/listinfo/python-list
'Once' properties.
Does python have a ‘once’ (per class) feature? ‘Once’, as I’ve know it is in Eiffel. May be in Java don’t. The first time you instantiate a given class into an object it constructs, say, a dictionary containing static information. In my case static is information that may change once a week at the most and there’s no need to be refreshing this data during a single running of the program (currently maybe 30 minutes). So you instantiate the same class into a second object, but instead of going to the databases again and recreating the same dictionary a second time, you get a pointer or reference to the one already created in the first object – copies into the second object that is. And the dictionary, no matter how many instances of the object you make, is always the same one from the first object. So, as we put it, once per class and not object. Saves on both time and space. -- http://mail.python.org/mailman/listinfo/python-list