Thanks everyone. Looks like I have reading to do... On 3/3/11, bruno desthuilliers <bruno.desthuilli...@gmail.com> wrote: > > On 2 mar, 22:02, Alex Hall <mehg...@gmail.com> wrote: >> Hi all, >> Still working through that tutorial. I am just curious: why are none >> of the class variables called self.var, but rather just var? For >> example: >> import models >> class Poll(models.Model): >> question=models.CharField(max_length=200) > > > What you define here is a class attribute, not an instance attribute. > FWIW, Django models do some metaprogramming magic with the models > fields, but that's rather advanced Python programming. You'll have to > read about Python's object model, metaclasses and descriptors if you > really want to understand what's going on here. > >> Should that not be >> self.question=... >> instead? > > "self" is nothing magical, it's just a coding convention for functions > meant to be used as bound methods. You could replace it with "parrot" > in your code, it would work just the same. So, "self" is only a name > like any other, usually used to refer to the object the function's > code is working on. This instance is passed to the function like any > other argument (even if there's some other metaprogramming magic > happening here). myobj.method() is just a convenient shortcut for > myobj.__class__.method(myobj) - and that's indeed what really happens. > > >> Otherwise, saying something like: >> poll=Poll() >> poll.question="question?" >> should not work; > > > For which definition of "should not work" ?-) > > Python is a dynamic language. You can add / replace / remove instance > or class attributes (almost) at will: >>>> class Foo(object): > ... pass > ... >>>> f = Foo() >>>> f.bar = 42 >>>> f.bar > 42 >>>> f2 = Foo() >>>> f2.bar > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > AttributeError: 'Foo' object has no attribute 'bar' >>>> del f.bar >>>> f.bar > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > AttributeError: 'Foo' object has no attribute 'bar' >>>> > >> question is not told to be part of the class by way >> of self. > > 'poll.question' is an ordinary instance attribute. The "question" > attribute defined in the Poll class is something very different. > >> This may stray from django and into pure python territory, > > Well, Django is a Python framework, so to understand Django you have > to understand Python... > >> so >> sorry if it gets off-topic. I have never seen a class that does not >> tie its variables to itself > > Looks like you're confusing class and instance. Every name defined at > the top level of a class statement's block become an attribute of the > class itself (yes, Python classes are objects too) - unless the > class's class (aka metaclass) do something weird with it when the > class statement is eval'd. > > >> with self or some other keyword. > > self is NOT a keyword. > >> Come to >> think of it, there is no __init__ method. I know that it is not >> necessary to have one, but I figured I would have seen one to get >> things set up. > > > There's of course a __init__ method, in the models.Model base class. > One of the nice things with Django is that it's opensource. This means > that you have the whole source code and the right to read it ;) > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To post to this group, send email to django-users@googlegroups.com. > To unsubscribe from this group, send email to > django-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-users?hl=en. > >
-- Have a great day, Alex (msg sent from GMail website) mehg...@gmail.com; http://www.facebook.com/mehgcap -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.