Assigning to self.__class__

P

Paul McGuire

I have some places in pyparsing where I've found that the most
straightforward way to adjust an instance's behavior is to change its class.
I do this by assigning to self.__class__, and things all work fine.

(Converting to use of __new__ is not an option - in one case, the change is
temporary, and before the end of the function, I change it back again.)

Any comments on this practice? Is this intended capability for Python
objects, or am I taking advantage of a fortuitous accident, which may get
undone at a future time?

-- Paul
 
B

bruno at modulix

Paul said:
I have some places in pyparsing where I've found that the most
straightforward way to adjust an instance's behavior is to change its class.

Hooray ! You've just (re)discovered the state pattern... for which the
most stupid simple implementation in Python is to :
(snip) assigning to self.__class__, (snip)
!-)


Any comments on this practice?

It can be very confusing for newbies and peoples having no experience
with *dynamic* languages, and I guess control-freaks and
static-typing-addicts would runaway screaming. But I like it anyway !-)
Is this intended capability for Python
objects,

AFAIK, yes.
or am I taking advantage of a fortuitous accident, which may get
undone at a future time?

It's certainly not a fortuitous accident.
 
H

Heiko Wundram

bruno said:
It's certainly not a fortuitous accident.

And even the (printed) cookbook has examples which assign to
self.__class__... I guess this means this feature isn't going to go away
soo. ;-)

--- Heiko.
 
A

Alex Martelli

Heiko Wundram said:
And even the (printed) cookbook has examples which assign to
self.__class__... I guess this means this feature isn't going to go away

Hmmm, I'm the main decision-maker for what goes in the printed cookbook,
but it's Guido who decides what stays or goes in the language, and it's
not as if we always agree (though I will admit that when we disagree it
later usually turns out he's right, but that's another issue;-). Still,
in this case I don't think we disagree!-)


Alex
 
T

Terry Reedy

Paul McGuire said:
I have some places in pyparsing where I've found that the most
straightforward way to adjust an instance's behavior is to change its
class.
I do this by assigning to self.__class__, and things all work fine.

(Converting to use of __new__ is not an option - in one case, the change
is
temporary, and before the end of the function, I change it back again.)

Any comments on this practice? Is this intended capability for Python
objects, or am I taking advantage of a fortuitous accident, which may get
undone at a future time?

Very little if any of the new class stuff is accidental. As I remember,
..__class__ was originally read-only and was intentionally changed when
practical use cases for rewriting it were developed and presented with a
request for change. Though I could be wrong, I would comfortably use this
feature myself.

Terry J. Reedy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top