basic class question..
Pyrot
sungsuha at gmail.com
Sun Nov 15 19:17:31 EST 2009
On 11월15일, 오후10시15분, Tim Chase <python.l... at tim.thechases.com> wrote:
> Pyrot wrote:
> > class rawDNA:
> > import string
> > trans = string.maketrans("GATC","CTAG")
>
> > def __init__(self, template = "GATTACA"):
> > self.template = template //shouldn't this make "template"
> > accessible within the scope of "rawDNA"??
>
> No. Python's scope resolution consists only of "local, global,
> or explicit". There is no "try to find this in the instance or
> class" scope-resolution guessing. Your code makes "template"
> accessible within the scope of "self", not in a global
> unqualified scope.
>
> So this:
>
> > def noncoding(self):
> > print template.translate(trans) //
>
> tries to reference "template" first in the local scope (within
> noncoding(), but it doesn't exist there), then in the global
> scope (it also doesn't exist there), and stops.
>
> It should be as you have it here:
>
> > class rawDNA:
> > import string
> > trans = string.maketrans("GATC","CTAG")
> > def __init__(self, template = "GATTACA"):
> > self.template = template
> > def noncoding(self):
> > print self.template.translate(trans)
>
> Here, you start with "self" which *is* in the local scope, which
> *does* contain "template" and so it successfully finds it and all
> is [qualifiedly] good. However, you'll also find that "trans"
> isn't found because it's neither in the local nor global scope:
>
> >>> class RawDNA:
> ... import string
> ... trans = string.maketrans("GATC", "CTAG")
> ... def __init__(self, template="GATTACA"):
> ... self.template = template
> ... def noncoding(self):
> ... print self.template.translate(trans)
> ...
> >>> r = RawDNA()
> >>> r.noncoding()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 7, in noncoding
> NameError: global name 'trans' is not defined
>
> so you need to fully qualify it as "RawDNA.trans" for Python to
> find it. (I also shifted to using the PEP-8 naming convention
> "RawDNA" instead of "rawDNA").
>
> Which you indeed discovered:
>
> > this works as intended.
>
> Being explicit is part of "Python Zen" (from the python
> command-prompt, type "import this" to see the whole list)
>
> -tkc
thanks!
one last question, is "self.template.translate(trans)" the right way
to go(pythonic?)?
I found it to be cumbersome(and a mouthful) and thought I might have
been doing it wrong :-)
More information about the Python-list
mailing list