|
|
 |
 |
 |
 |
Python Programming Language
|
 |
 |
 |
 |
 |
 |
 |
 |
How to set a class inheritance at instance creation?
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
On May 29, 8:52 pm, glomde <tbr@yahoo.com> wrote:
> 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. > 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
Why not just have Lang1 and Lang2 inherit from WriteStruct as well? On May 29, 8:52 am, glomde <tbr@yahoo.com> wrote:
> 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
On 29 Maj, 19:27, "shand@gmail.com" <shand@gmail.com> wrote: > 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.
> On May 29, 8:52 am, glomde <tbr@yahoo.com> wrote: > > 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
On 29 Maj, 19:20, Ramashish Baranwal <ramashish.li@gmail.com> wrote:
> On May 29, 8:52 pm, glomde <tbr @yahoo.com> wrote: > > 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.
This would work I think. Thanks. > > 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.
> Ram
On May 29, 8:52 pm, glomde <tbr@yahoo.com> wrote:
> 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() > 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
glomde schrieb:
> 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()`. >>> def foo(self, blah): ... print self, blah ... >>> attrs = {'foo': foo} >>> cls = type('MyCls', (object,), attrs) >>> cls().foo(4) <__main__.MyCls object at 0x009E86D0> 4 Changing ``object`` (the tuple contains all bases) will change the parent. But, better stick to previous solutions. :) Stargaming
glomde wrote: > 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 wrote: > 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 ----------------
On 29 Maj, 22:45, Steve Holden <s@holdenweb.com> wrote:
> glomde wrote: > > 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.
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
> 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 ----------------
|
 |
 |
 |
 |
|