Help creating new module which inherits existing class from another module.
On Tue, 18 Feb 2014 14:34:51 -0600, Jonno wrote:
> There is an existing module I want to use which has a class we'll call
> *Existing Class*.
> I want to create a python module which allows me to create *new_objects*
> with the following properties:
> - The new_objects have all the attributes of the Existing_Class
> (simply create a class that inherits from Existing_Class)
That part is easy:
from some_module import ExistingClass
newobject = NewClass()
> - I then
> want to create a nested structure under the new_objects something
> Where foo, bar, baz have the following properties:
> - All have *docstrings*
> - All are available for *tab completion* tools upon new_object
Well, that depends on the tab completion tools you are using.
> - Some of which will have *new methods* which act in the following
> - new_object.foo.bar()
> - new_object.existing_method("foo.bar", *args)
Seems awfully complicated, and I don't understand what you would do with
these strange things, but okay.
Start by ignoring the "existing class" and concentrated on these foo,
foo.bar, foo.bar.baz things. It isn't clear to me what they are, but I
think that you want foo to be an object which is callable, as well as
having an attribute bar (which itself is callable, etc.). The way to do
that is with a class:
def __init__(self, parent):
self.parent = parent
Add your foo, bar and baz methods as needed, and we'll look for a way to
calculate "something" on the fly later.
Now remember your NewClass definition above? What we'd like to do is this:
foo = FooClass(self)
but of course you can't, because self doesn't exist until the class is
instantiated! So what we need if for foo to be a descriptor. I don't
quite remember the descriptor syntax, so this may be wrong, but I think
you want something like this:
# This is probably wrong.
def __get__(self, cls, obj):
and then in NewClass you put in:
foo = FooDescriptor()
The idea is that when you have a NewClass instance, calling
"newobject.foo" will automatically call the descriptor's __getmethod__,
passing it the class and instance. That descriptor will create and
populate the FooClass instance, which does the real work.
Descriptors are how methods, classmethods, staticmethods and properties
work, so they are a fundamental, powerful way of implementing things like