python self-less
class, python, self
Solution
Python methods are just functions that are bound to the class or instance of a class. The only difference is that a method (aka bound function) expects the instance object as the first argument. Additionally when you invoke a method from an instance, it automatically passes the instance as the first argument. So by defining `self` in a method, you're telling it the namespace to work with.
This way when you specify `self.a` the method knows you're modifying the instance variable `a` that is part of the instance namespace.
Python scoping works from the inside out, so each function (or method) has its own namespace. If you create a variable `a` locally from within the method `p` (these names suck BTW), it is distinct from that of `self.a`. Example using your code:
class d:
def __init__(self,arg):
self.a = arg
def p(self):
a = self.a - 99
print "my a= ", a
print "instance a= ",self.a
x = d(1)
y = d(2)
x.p()
y.p()
Which yields:
my a= -98
instance a= 1
my a= -97
instance a= 2
Lastly, you don't have to call the first variable `self`. You could call it whatever you want, although you really shouldn't. It's convention to define and reference `self` from within methods, so if you care at all about other people reading your code without wanting to kill you, stick to the convention!
Further reading:
- Python Classes tutorial
Problem
this works in the desired way: ``` class d: def __init__(self,arg): self.a = arg def p(self): print "a= ",self.a x = d(1) y = d(2) x.p() y.p() ``` yielding ``` a= 1 a= 2 ``` i've tried eliminating the "self"s and using a global statement in `__init__` ``` class d: def __init__(self,arg): global a a = arg def p(self): print "a= ",a x = d(1) y = d(2) x.p() y.p() ``` yielding, undesirably: ``` a= 2 a= 2 ``` is there a way to write it without having to use "self"?