What is the reason for defining classes within classes in Python?
vasudevram
vasudevram at gmail.com
Wed Apr 24 07:01:46 EDT 2013
On Wednesday, April 24, 2013 6:20:36 AM UTC+5:30, alex23 wrote:
> On Apr 24, 9:13 am, vasudevram <vasudev... at gmail.com> wrote:
>
> > On Wednesday, April 24, 2013 3:52:57 AM UTC+5:30, Ian wrote:
>
> > > On Tue, Apr 23, 2013 at 3:50 PM, vasudevram wrote:
>
> > > > I saw an example of defining a class within another class
>
> > > > In what way is this useful?
>
> >
>
> > > In that particular case they're just using it as a namespace.
>
> >
>
> > Not clear. An example or more explanation might help, if you can. Thanks.
>
>
>
> Namespaces are used to allow for the same label to be applied to
>
> different concepts without the labels conflicting with each other. If
>
> I was writing a program that dealt with the mathematics of morality, I
>
> might want to use the sine function and refer to it in the standard
>
> way as 'sin', and I might also want to store a value representing your
>
> lack of goodness as 'sin'. As you can't use the same label in the same
>
> scope to refer to two different objects, one way of dealing with this
>
> that lets you still use what you feel are the most appropriate names
>
> is to put them into a namespace. So you could express this as:
>
>
>
> class Math(object):
>
> sin = function()
>
>
>
> class Morality(object):
>
> sin = True
>
>
>
> Then in your code you can clearly distinguish between the two by using
>
> Math.sin and Morality.sin. Modules & packages are also namespaces, so
>
> in this example we'd replace the Math class with `import math`, which
>
> has a sin function defined within it.
>
>
>
> A nested class definition will be defined as an attribute of the class
>
> its defined within:
>
>
>
> >>> class Outer(object):
>
> ... foo = 'FOO'
>
> ... class Inner(object):
>
> ... bar = 'BAR'
>
> ...
>
> >>> Outer.Inner
>
> <class '__main__.Inner'>
>
> >>> Outer.Inner.bar
>
> 'BAR'
>
>
>
> With peewee, the Model class looks for a Meta attribute and uses
>
> attributes on it to perform some tasks, like where to retrieve/store
>
> the model data. This allows for a way of distinguishing between
>
> attributes used to define fields, and attributes needed for those
>
> tasks. It also means your Models can use field names that the class
>
> would otherwise reserve for its own internal purposes:
>
>
>
> class DatabaseDetails(Model):
>
> # these attributes are fields
>
> database = CharField()
>
> owner = CharField()
>
>
>
> # ...but the Meta attribute isn't
>
> class Meta:
>
> # these attributes are used by the Model class
>
> database = db
>
>
>
> Here, database as a field is a text string that could contain a
>
> database name, while DatabaseDetails.Meta.database contains a
>
> reference to an actual database where the DatabaseDetails record would
>
> be stored.
Actually, I did know what namespaces are in general. What I didn't get was how the inner class Meta in the peewee example was being used as a namespace. Your explanation makes things very clear. Thank you.
Just one other doubt:
> >>> Outer.Inner
>
> <class '__main__.Inner'>
>
In the above output, I would have thought Python would print __main__.Outer.Inner or Outer.Inner instead of __main__.Inner, since Inner is an attribute of Outer?
More information about the Python-list
mailing list