473,236 Members | 1,423 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,236 software developers and data experts.

Can you create an instance of a subclass with an existing instance of the base class?

Can you create an instance of a subclass using an existing instance of
the base class?

Such things would be impossible in some languages or very difficult in
others. I wonder if this can be done in python, without copying the
base class instance, which in my case is a very expensive object.

Any ideas?

Thanks,
-Sandra

Apr 21 '06 #1
18 7329
In article <11**********************@j33g2000cwa.googlegroups .com>,
"Sandra-24" <sa***********@yahoo.com> wrote:
Can you create an instance of a subclass using an existing instance of
the base class?


I think you're taking Python's OO-ness too seriously. One of the
strengths of Python is that it can _look_ like an OO language without
actually being OO.
Apr 21 '06 #2
With new-style classes you can find out a class' subclasses and then
you can instantiate the subclass you want. Suppose you have two classes
A and B, B is a subclass of A, A is a new-style class. Now you have an
A's instance called "a", to instance B you can do the following:

b = a.__class__.__subclasses__()[0]()

Apr 22 '06 #3
Sandra-24 wrote:
Can you create an instance of a subclass using an existing instance of
the base class?

Such things would be impossible in some languages or very difficult in
others. I wonder if this can be done in python, without copying the
base class instance, which in my case is a very expensive object.


You can change the class of an instance by assigning to the __class__
attribute. The new class doesn't even need to be a subclass of the old:
class A(object): .... def __init__(self, name):
.... self.name = name
.... def show(self): print self.name
.... a = A("alpha")
a.show() alpha class B(object): .... def show(self): print self.name.upper()
.... a.__class__ = B
a.show()

ALPHA

Peter
Apr 22 '06 #4
Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.

In this case it doesn't work.

TypeError: __class__ assignment: only for heap types

I suspect that's because this object begins its life in C code.

The technique of using the __class__.__subclasses__ also fails:

TypeError: cannot create 'B' instances

This seems more complex than I thought. Can one do this for an object
that beings it's life in C?

Thanks,
-Sandra

Peter Otten wrote:
Sandra-24 wrote:
Can you create an instance of a subclass using an existing instance of
the base class?

Such things would be impossible in some languages or very difficult in
others. I wonder if this can be done in python, without copying the
base class instance, which in my case is a very expensive object.


You can change the class of an instance by assigning to the __class__
attribute. The new class doesn't even need to be a subclass of the old:
class A(object): ... def __init__(self, name):
... self.name = name
... def show(self): print self.name
... a = A("alpha")
a.show() alpha class B(object): ... def show(self): print self.name.upper()
... a.__class__ = B
a.show()

ALPHA

Peter


Apr 22 '06 #5
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:
Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.


That's because you're still thinking in OO terms.
Apr 22 '06 #6
Sandra-24 wrote:
Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.

In this case it doesn't work.

TypeError: __class__ assignment: only for heap types

I suspect that's because this object begins its life in C code.

The technique of using the __class__.__subclasses__ also fails:

TypeError: cannot create 'B' instances

This seems more complex than I thought. Can one do this for an object
that beings it's life in C?


The restriction originates in the metaclass. Perhaps you can use a
customized metaclass that allows subclass assignment, but I don't know
enough about Python's internals to tell you how/whether that is possible.

An alternative might be that you always start out with a subclass coded in
Python:
abc = tuple("abc")
abc.__class__ = tuple Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: __class__ assignment: only for heap types

class Tuple(tuple): pass .... class Subclass(Tuple): .... first = property(lambda self: self[0])
.... abc = Tuple("abc")
abc.__class__ = Subclass
abc.first

'a'

In the example a Tuple should be able to do everything a tuple can do;
because Tuple is coded in Python you can also change the __class__.

Peter

Apr 23 '06 #7
Lawrence D'Oliveiro wrote:
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:
Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.


That's because you're still thinking in OO terms.


It's not quite as simple as all that. I agree that people, escpecially
people with a Java (ew) background overuse OO, when there's often
simpler ways of doing things.

However in this case I'm simply getting an object (an mp_request object
from mod_python) passed into my function, and before I pass it on to
the functions that make up and individual web page it is modified by
adding members and methods to add functionality. It's not that I'm
thinking in OO, but that the object is a convienient place to put
things, especially functions that take an mp_request object as their
first argument.

Sadly I'm unable to create it as a python object first, because it's
created by the time my code comes into play. So I have to resort to
using the new module to add methods.

It works, but it has to be redone for every request, I thought moving
the extra functionality to another object would simplify the task. A
better way might be to contain the mp_request within another object and
use __getattr__ to lazily copy the inner object. I'd probably have to
first copy those few fields that are not read-only or use __setattr__
as well.

Thanks,
-Sandra

Apr 23 '06 #8
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:
However in this case I'm simply getting an object (an mp_request object
from mod_python) passed into my function, and before I pass it on to
the functions that make up and individual web page it is modified by
adding members and methods to add functionality.


All you want is a dictionary, then. That's basically what Python objects
are.
Apr 24 '06 #9
Lawrence D'Oliveiro wrote:
(snip)
I think you're taking Python's OO-ness too seriously. One of the
strengths of Python is that it can _look_ like an OO language without
actually being OO.


According to which definition of OO ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Apr 24 '06 #10

Lawrence D'Oliveiro wrote:

All you want is a dictionary, then. That's basically what Python objects
are.


Yes, that's it exactly. I made a lazy wrapper for it, and I was really
happy with what I was able to accomplish, it turned out to be very
easy.

Thanks,
-Sandra

Apr 24 '06 #11
Sandra-24 a écrit :
Lawrence D'Oliveiro wrote:
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:

Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.
That's because you're still thinking in OO terms.


It's not quite as simple as all that. I agree that people, escpecially
people with a Java (ew) background overuse OO, when there's often
simpler ways of doing things.


Nope. I mean : they don't overuse OO, they overuse *classes*. AFAIK, OO
means *object* oriented - not class oriented. There are OO languages
that don't even have a notion of class.
However in this case I'm simply getting an object (an mp_request object
from mod_python) passed into my function, and before I pass it on to
the functions that make up and individual web page it is modified by
adding members and methods to add functionality.
Which is a well-known design pattern called "decorator".

(snip) Sadly I'm unable to create it as a python object first, because it's
created by the time my code comes into play. So I have to resort to
using the new module to add methods.
This is OK IMHO.
It works, but it has to be redone for every request,
Is this really a problem ?
I thought moving
the extra functionality to another object would simplify the task.

A
better way might be to contain the mp_request within another object and
use __getattr__ to lazily copy the inner object. I'd probably have to
first copy those few fields that are not read-only or use __setattr__
as well.


Why copy ? You could as well just use composition/delegation (also using
__getattr__ - and BTW, this is another possible implementation of the
decorator pattern).

Apr 24 '06 #12
In article <44***********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:
Lawrence D'Oliveiro wrote:
(snip)
I think you're taking Python's OO-ness too seriously. One of the
strengths of Python is that it can _look_ like an OO language without
actually being OO.


According to which definition of OO ?


Isn't there one?
Apr 25 '06 #13
Lawrence D'Oliveiro wrote:
In article <44***********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:

Lawrence D'Oliveiro wrote:
(snip)
I think you're taking Python's OO-ness too seriously. One of the
strengths of Python is that it can _look_ like an OO language without
actually being OO.


According to which definition of OO ?

Isn't there one?


Your claim that Python "_look_ like an OO language without actually
being OO" implicitely relies on a definition of OO - or is just
meaningless. So I ask you: what definition of OO do you use to support
your claim ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'on***@xiludom.gro'.split('@')])"
Apr 25 '06 #14
In article <44**********************@news.free.fr>,
Bruno Desthuilliers <bd*****************@free.quelquepart.fr> wrote:
Sandra-24 a écrit :
Lawrence D'Oliveiro wrote:
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:
Now that is a clever little trick. I never would have guessed you can
assign to __class__, Python always surprises me in it's sheer
flexibility.

That's because you're still thinking in OO terms.
It's not quite as simple as all that. I agree that people, escpecially
people with a Java (ew) background overuse OO, when there's often
simpler ways of doing things.


Nope. I mean : they don't overuse OO, they overuse *classes*. AFAIK, OO
means *object* oriented - not class oriented.


Oh great. Now we have someone redefining the concept of OO to evade the
point I was making.
There are OO languages that don't even have a notion of class.


Sounds like stuff I was doing in C (a non-OO language) years ago. Unless
you want to count C as an OO language, I think you're going to have to
retract this claim.
However in this case I'm simply getting an object (an mp_request object
from mod_python) passed into my function, and before I pass it on to
the functions that make up and individual web page it is modified by
adding members and methods to add functionality.


Which is a well-known design pattern called "decorator".


If you have to think of it as a design pattern, that means you haven't
figured out the code reuse angle yet.
Apr 27 '06 #15
In article <44**********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:
Lawrence D'Oliveiro wrote:
In article <44***********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:

Lawrence D'Oliveiro wrote:
(snip)

I think you're taking Python's OO-ness too seriously. One of the
strengths of Python is that it can _look_ like an OO language without
actually being OO.

According to which definition of OO ?


Isn't there one?


Your claim that Python "_look_ like an OO language without actually
being OO" implicitely relies on a definition of OO - or is just
meaningless.


Which nicely evades answering the question.
Apr 27 '06 #16
Lawrence D'Oliveiro wrote:
In article <44**********************@news.free.fr>,
Bruno Desthuilliers <bd*****************@free.quelquepart.fr> wrote:

Sandra-24 a écrit :
Lawrence D'Oliveiro wrote:
In article <11*********************@v46g2000cwv.googlegroups. com>,
"Sandra-24" <sa***********@yahoo.com> wrote:

>Now that is a clever little trick. I never would have guessed you can
>assign to __class__, Python always surprises me in it's sheer
>flexibility.

That's because you're still thinking in OO terms.

It's not quite as simple as all that. I agree that people, escpecially
people with a Java (ew) background overuse OO, when there's often
simpler ways of doing things.
Nope. I mean : they don't overuse OO, they overuse *classes*. AFAIK, OO
means *object* oriented - not class oriented.

Oh great. Now we have someone redefining the concept of OO to evade the
point I was making.


"redefining" ? lol...
There are OO languages that don't even have a notion of class.

Sounds like stuff I was doing in C (a non-OO language) years ago. Unless
you want to count C as an OO language, I think you're going to have to
retract this claim.


I think I'm not going to retract anything. And I think you should learn
a bit more about prototype-based languages.
However in this case I'm simply getting an object (an mp_request object
from mod_python) passed into my function, and before I pass it on to
the functions that make up and individual web page it is modified by
adding members and methods to add functionality.


Which is a well-known design pattern called "decorator".


If you have to think of it as a design pattern, that means you haven't
figured out the code reuse angle yet.


Please stop saying non-sense and learn the difference between design and
implementation.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Apr 27 '06 #17
In <ld***********************@lust.ihug.co.nz>, Lawrence D'Oliveiro wrote:
In article <44**********************@news.free.fr>,
Bruno Desthuilliers <bd*****************@free.quelquepart.fr> wrote:
Nope. I mean : they don't overuse OO, they overuse *classes*. AFAIK, OO
means *object* oriented - not class oriented.


Oh great. Now we have someone redefining the concept of OO to evade the
point I was making.
There are OO languages that don't even have a notion of class.


Sounds like stuff I was doing in C (a non-OO language) years ago. Unless
you want to count C as an OO language, I think you're going to have to
retract this claim.


That sounds like stuff you do in a language that has objects but no
classes. As C has no objects I would not count it as an OO language. But
I count Io as an OO language::

#!/usr/bin/env io
Foo := Object clone
Foo value := 42
Foo setValue := method(newValue, self value = newValue; self)
Foo beep := method("beep" linePrint)
Foo asString := method("I'm a Foo. My value is " .. self value)

Bar := Foo clone
Bar asString := method("I'm a Bar and " .. super asString)

foo := Foo clone
foo beep
foo asString linePrint

bar := Bar clone setValue(23)
bar beep
bar asString linePrint

Output is:

beep
I'm a Foo. My value is 42
beep
I'm a Bar and I'm a Foo. My value is 23

That's OO IMHO. Clonable objects that know their "ancestors" so you can
build an object hierarchy. Missing attributes are looked up in the
"ancestors" and one can explicitly look up the inheritance tree with
``super``. There are no classes, just four objects. Convention in naming
and usage makes two of them something like templates or "classes" for new
objects but they are in no way special.

Ciao,
Marc 'BlackJack' Rintsch
Apr 28 '06 #18
Lawrence D'Oliveiro wrote:
In article <44**********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:

Lawrence D'Oliveiro wrote:
In article <44***********************@news.free.fr>,
bruno at modulix <on***@xiludom.gro> wrote:

Lawrence D'Oliveiro wrote:
(snip)
>I think you're taking Python's OO-ness too seriously. One of the
>strengths of Python is that it can _look_ like an OO language without
>actually being OO.

According to which definition of OO ?

Isn't there one?


Your claim that Python "_look_ like an OO language without actually
being OO" implicitely relies on a definition of OO - or is just
meaningless.

Which nicely evades answering the question.


Well I have to say you are also nicely evading answering the question,
which is enough to make me suspect your are trolling (deliberately
asking contentious questions for the purposes of creating futile
argument and discussion).

If you *aren't* trolling then what's your objection to saying what led
you to make the assertion that Python could look like an OO language
without being one?

But sine you say later that "Python objects are basically dictionaries"
it's clear your understanding of Python isn't terribly complete, which
might cast doubt on your understanding of object orientation.

For the record, Python *is* an object-oriented language, but it happens
to offer convenient features for procedural programming as well. Since
these features are orthogonal to its OO features, the fact that they
exist doesn't stop Python from being an OO language.

So why do you assert that it "merely looks like" one?

regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Love me, love my blog http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Apr 29 '06 #19

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Stephen Nesbitt | last post by:
All: Here's my implementation problem. I have a base class which has the responsibility for providing entry into the logging system. Part of the class responsibility is to ensure that lagger...
37
by: Mike Meng | last post by:
hi all, I'm a newbie Python programmer with a C++ brain inside. I have a lightweight framework in which I design a base class and expect user to extend. In other part of the framework, I heavily...
4
by: Joe HM | last post by:
Hello - I have a Base Class where I want a New() implemented that can be called from the outside. This New() should create an instance of the appropriate cDerivedX Class ... The following...
8
by: Lou Pecora | last post by:
I've been scanning Python in a Nutshell, but this seems to be either undoable or so subtle that I don't know how to do it. I want to subclass a base class that is returned from a Standard Library...
1
by: s.lipnevich | last post by:
Hi All, Is anything wrong with the following code? class Superclass(object): def __new__(cls): # Questioning the statement below return super(Superclass, cls).__new__(Subclass) class...
5
by: JH | last post by:
Hi I found that a type/class are both a subclass and a instance of base type "object". It conflicts to my understanding that: 1.) a type/class object is created from class statement 2.) a...
5
by: Sergio Montero | last post by:
I have a MustInherits Base class that implements a custom IDataLayer interfase. IDataLayer expose CRUD methods. Base class constructor requires two parameters: ConnectionString TableName ...
6
by: Me | last post by:
I need to be able to acces non-virtual members of sublcasses via a base class pointer...and without the need for an explicit type cast. I thought a pure virtual getPtr() that acts as a type cast...
4
by: Kurt Smith | last post by:
Hi List: Class inheritance noob here. For context, I have the following base class and subclass: class Base(object): def __init__(self, val): self.val = val
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.