[Baypiggies] Frequently Argued Objections

Warren Stringer warren at muse.com
Mon Jun 23 16:41:26 CEST 2008


Hey JJ, Kelly, I've combined both of your replies,

On Jun 23, 2008, at 2:48 AM, Shannon -jj Behrens wrote:

> Let's make it really fun:
>
> from thirdparty import *
>
> class A(B):
>  def bar():  # Assuming we have implicit self.
>    foo()
>
> Now, did foo come from:
>
> * The parent class B?
> * Something in thirdparty?
> * Something in thirdparty that someone else shoved in there  
> dynamically?
> * Something in builtins that someone else shoved in there dynamically?
> * Some global in the current module that's a few hundred lines down?
> * Some global in the current module that someone else shoved in from
> a third-party module? ;)
>
> Using self cuts down on the possibilities which:
>
> a) Saves the interpreter from doing a bunch of useless dict lookups.
> b) Saves the reader from trying to figure out what's going on.

OK, I'm sure that I'm missing something. Couldn't this be resolved  
with something like:

1) B.foo()
2) super.foo() # or ..foo() with dot_as_self convention expanded to  
emulate a file system
3) thirdparty.foo()
4) __builtins__.foo(

Moreover, since we're talking about not using self for items that are  
local to the class, the example should really be:

class A(B):
   def foo:
      ... # foo statements
   ...  # other statements
   def bar():
       foo()

In this case, the resolving of 'foo' ranges from blindingly easy (when  
the distance from foo's declaration is short), to search-ably easy  
(when the distance from foo's declaration is long)

On Jun 22, 2008, at 11:53 PM, Kelly Yancey wrote:
>
>  I admit, I have had to call self by another name on a couple of  
> occasions.  Specifically, I had a factory method in one class that  
> returned instances of a dynamically-created class.  The returned  
> objects had methods that referenced both their own instance's  
> attributes and attributes of the factory method's parent object (via  
> closure).  Since there were two objects involved, I used self to  
> refer to the factory-generated object itself, and had the factory  
> method use a different name for its own object reference argument so  
> the generated object could still access both.
>  Complicated?  Sure.
>  Possible with implicit self?  Nope


As with other languages, 'self' can still be available; simply not  
required.

On Jun 23, 2008, at 2:48 AM, Shannon -jj Behrens wrote:
> As a blanket statement, polymorphism can be confusing.  When I see
> "self", at least it's a good sign that I should start looking at
> either the class's documentation or one of its ancestor's
> documentation.
>
> -jj

These days, I do a search within the IDE, a spotlight search (Mac), or  
a Google Desktop search (PC). WIth several IDEs, I can right click to  
find the definitions. Some tools provide an accurate call graph. Many  
of these tools weren't available when Python was first created. Thirty- 
three years ago, most of my debugging involved reading code printouts  
from a KSR 35 teletype. Since then, my habits have changed.

My guess is that:
	1)  9 times out of 10 the var in self.var is blindingly obvious,
	2) 99 times out of 100 it is obvious after a 10 second search,
	3) when non-obvious, it may indicate an obscure namespace that
  		a) has ballooned out to a complexity that should be refactored
		b) wouldn't be solved by simple code reading aides, like self

\~/






More information about the Baypiggies mailing list