Connecting Tech Pros Worldwide Help | Site Map

How to set a class inheritance at instance creation?

glomde
Guest
 
Posts: n/a
#1: May 29 '07
Hi I wonder if you can set what subclass a class should
have at instance creation.

The problem is that I have something like:

class CoreLang():
def AssignVar(self, var, value):
pass

class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value

class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value

class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()

The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.

So in code I would like to write something like:

WriteStruct(Lang1).Generate(vars)

Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.


Cheers,

/T

Ramashish Baranwal
Guest
 
Posts: n/a
#2: May 29 '07

re: How to set a class inheritance at instance creation?


On May 29, 8:52 pm, glomde <tbr...@yahoo.comwrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
class WriteStruct:
def __init__(self, SubClass):
self._sub = SubClass()
def Generate(self, vars):
for var in vars:
print self._sub.AssignVar()

This does what you want but isn't inheritance.
Quote:
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
I don't think I understood what you want here.

Ram

shandy.b@gmail.com
Guest
 
Posts: n/a
#3: May 29 '07

re: How to set a class inheritance at instance creation?


Why not just have Lang1 and Lang2 inherit from WriteStruct as well?

On May 29, 8:52 am, glomde <tbr...@yahoo.comwrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
>
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
Cheers,
>
/T

glomde
Guest
 
Posts: n/a
#4: May 29 '07

re: How to set a class inheritance at instance creation?


On 29 Maj, 19:27, "shand...@gmail.com" <shand...@gmail.comwrote:
Quote:
Why not just have Lang1 and Lang2 inherit from WriteStruct as well?
This wont work I think since if add antoher Class:

class WriteStruct():

def func1(self);
print "Hello2"

def Generate(self):
self.func1()

class WriteStruct2(WriteStruct):

def func1(self);
print "Hello"

def Generate(self):
self.func1()

Den if Lang1, inherit both WriteStruct and WriteStruct2 I will
get name clashes.

In my real code I have very big Generate Method in WriteStruct that
calls submethods.
and thes submethods should be overriden by the subclasses. So I cant
change the name
on the submethods.
Quote:
>
On May 29, 8:52 am, glomde <tbr...@yahoo.comwrote:
>
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
Quote:
The problem is that I have something like:
>
Quote:
class CoreLang():
def AssignVar(self, var, value):
pass
>
Quote:
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
Quote:
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
Quote:
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
Quote:
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
Quote:
So in code I would like to write something like:
>
Quote:
WriteStruct(Lang1).Generate(vars)
>
Quote:
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
Quote:
Cheers,
>
Quote:
/T

glomde
Guest
 
Posts: n/a
#5: May 29 '07

re: How to set a class inheritance at instance creation?


On 29 Maj, 19:20, Ramashish Baranwal <ramashish.li...@gmail.com>
wrote:
Quote:
On May 29, 8:52 pm, glomde <tbr...@yahoo.comwrote:
>
>
>
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
Quote:
The problem is that I have something like:
>
Quote:
class CoreLang():
def AssignVar(self, var, value):
pass
>
Quote:
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
Quote:
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
Quote:
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
Quote:
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
Quote:
So in code I would like to write something like:
>
Quote:
WriteStruct(Lang1).Generate(vars)
>
class WriteStruct:
def __init__(self, SubClass):
self._sub = SubClass()
def Generate(self, vars):
for var in vars:
print self._sub.AssignVar()
>
This does what you want but isn't inheritance.
This would work I think. Thanks.
Quote:
>
Quote:
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
I don't think I understood what you want here.
>
I just dont want to pass the class in the instancecreation.
Somhehow in my:

class Lang1(CoreLang):

def Function(self):
WriteStruct().Generate()

Then somehow this WriteStruct should magically know that has been
instantiated in Lang1.
But this is not really needed. Just wondered if it was possible.
Quote:
Ram

Ramashish Baranwal
Guest
 
Posts: n/a
#6: May 29 '07

re: How to set a class inheritance at instance creation?


On May 29, 8:52 pm, glomde <tbr...@yahoo.comwrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
class WriteStruct:
def __init__(self, SubClass):
self._sub = SubClass()
def Generate(self, vars):
for var in vars:
print self._sub.AssignVar()
Quote:
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
I don't think I understood what you want here.

Ram

Stargaming
Guest
 
Posts: n/a
#7: May 29 '07

re: How to set a class inheritance at instance creation?


glomde schrieb:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
>
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
>
Cheers,
>
/T
>
If you really need to inherit at runtime, you could utilize `type()`.
Quote:
Quote:
Quote:
>>def foo(self, blah):
.... print self, blah
....
Quote:
Quote:
Quote:
>>attrs = {'foo': foo}
>>cls = type('MyCls', (object,), attrs)
>>cls().foo(4)
<__main__.MyCls object at 0x009E86D04

Changing ``object`` (the tuple contains all bases) will change the
parent. But, better stick to previous solutions. :)

Stargaming
Steve Holden
Guest
 
Posts: n/a
#8: May 29 '07

re: How to set a class inheritance at instance creation?


glomde wrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
>
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
>
You should rethink your program design.

It seems that when you create a WriteStruct you should really be passing
its __init__() method the class that you want it to be a "subclass" of,
creating an instance of that class, and then using generic delegation to
that subclass (using a modified __getattr__()) to handle methods that
aren't found in the WriteStruct.

I can see there are circumstances in which this might not work, but I
believe your current ugly intentions reveal a design smell that you
really need to get rid of if you want a clean program.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
------------------ Asciimercial ---------------------
Get on the web: Blog, lens and tag your way to fame!!
holdenweb.blogspot.com squidoo.com/pythonology
tagged items: del.icio.us/steve.holden/python
All these services currently offer free registration!
-------------- Thank You for Reading ----------------
Steve Holden
Guest
 
Posts: n/a
#9: May 29 '07

re: How to set a class inheritance at instance creation?


glomde wrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
The problem is that I have something like:
>
class CoreLang():
def AssignVar(self, var, value):
pass
>
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
So in code I would like to write something like:
>
WriteStruct(Lang1).Generate(vars)
>
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
>
You should rethink your program design.

It seems that when you create a WriteStruct you should really be passing
its __init__() method the class that you want it to be a "subclass" of,
creating an instance of that class, and then using generic delegation to
that subclass (using a modified __getattr__()) to handle methods that
aren't found in the WriteStruct.

I can see there are circumstances in which this might not work, but I
believe your current ugly intentions reveal a design smell that you
really need to get rid of if you want a clean program.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
------------------ Asciimercial ---------------------
Get on the web: Blog, lens and tag your way to fame!!
holdenweb.blogspot.com squidoo.com/pythonology
tagged items: del.icio.us/steve.holden/python
All these services currently offer free registration!
-------------- Thank You for Reading ----------------

glomde
Guest
 
Posts: n/a
#10: May 29 '07

re: How to set a class inheritance at instance creation?


On 29 Maj, 22:45, Steve Holden <s...@holdenweb.comwrote:
Quote:
glomde wrote:
Quote:
Hi I wonder if you can set what subclass a class should
have at instance creation.
>
Quote:
The problem is that I have something like:
>
Quote:
class CoreLang():
def AssignVar(self, var, value):
pass
>
Quote:
class Lang1(CoreLang):
def AssignVar(self, var, value):
return var, "=", value
>
Quote:
class Lang2(CoreLang):
def AssignVar(self, var, value):
return var, "<=", value
>
Quote:
class WriteStruct():
def Generate(self, vars):
for var in vars:
print self.AssignVar()
>
Quote:
The problem is that I want WriteStruct to sometimes be a subclass of
Lang1 and sometimes
of Lang2.
In the above example I could but the Generate Method in CoreLang. But
in my real
example I also want to able to subclass WriteStruct to be able to easy
customize WriteStruct.
Which I wouldnt be able to do if it was a method in CoreLang.
>
Quote:
So in code I would like to write something like:
>
Quote:
WriteStruct(Lang1).Generate(vars)
>
Quote:
Even better would be that if I in the Lang1 class could
just do WriteStruct().Generate(vars) and Lang1 class would
magically make WriteStruct a subclass of itself.
>
You should rethink your program design.
>
It seems that when you create a WriteStruct you should really be passing
its __init__() method the class that you want it to be a "subclass" of,
creating an instance of that class, and then using generic delegation to
that subclass (using a modified __getattr__()) to handle methods that
aren't found in the WriteStruct.
This is what I am going to do. For some reason I got stuck to think
I needed to solve it with inheritance.

Didnt think of the possibility to modify getattr to make
the delegation be much nicer. Thanks for the tip

Quote:
>
I can see there are circumstances in which this might not work, but I
believe your current ugly intentions reveal a design smell that you
really need to get rid of if you want a clean program.
>
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
------------------ Asciimercial ---------------------
Get on the web: Blog, lens and tag your way to fame!!
holdenweb.blogspot.com squidoo.com/pythonology
tagged items: del.icio.us/steve.holden/python
All these services currently offer free registration!
-------------- Thank You for Reading ----------------

Closed Thread