Baf Baf - 6 months ago 17
Python Question

Passing variables, creating instances, self, The mechanics and usage of classes: need explanation

I've been sitting over this the whole day and Im a little tired already so please excuse me being brief.

Im new to python.

I just rewrote a working program, into a bunch of functions in a class and everything messed up. I dont know if it's me but I'm very surprised I couldn't find a beginner's tutorial on how to handle classes on the web so I have a few questions.

First of all, in the

__init__
section of the class I have declared a bunch of variables with
self.variable=something
.

Is it correct that I should be able to access/modify these variables in every function of the class by using
self.variable
in that function? In other words, by declaring
self.variable
I have made these variables, global variables in the scope of the class right?

If not, how do I handle self?

Secondly, how do I correctly pass arguments to the class? Some example code would be cool.

Thirdly, how do I call a function of the class outside of the class scope? Some example code would be cool.

Fouthly, how do I create an Instance of the
class INITIALCLASS
in another
class OTHERCLASS
, passing variables from
OTHERCLASS
to
INITIALCLASS
? Some example code would be cool.

I Want to call a function from
OTHERCLASS
with arguments from
INITIALCLASS
. What I've done so far is.

class OTHERCLASS():
def __init__(self,variable1,variable2,variable3):
self.variable1=variable1
self.variable2=variable2
self.variable3=variable3
def someotherfunction(self):
something=somecode(using self.variable3)
self.variable2.append(something)
print self.variable2
def somemorefunctions(self):
self.variable2.append(variable1)

class INITIALCLASS():
def __init__(self):
self.variable1=value1
self.variable2=[]
self.variable3=''
self.DoIt=OTHERCLASS(variable1,variable2,variable3)

def somefunction(self):
variable3=Somecode
#tried this
self.DoIt.someotherfunctions()
#and this
DoIt.someotherfunctions()


I clearly didn't understand how to pass variables to classes or how to handle
self
, when to use it and when not. I probably also didn't understand how to properly create an isntance of a class. In general I didn't understand the mechanics of classes so please help me and explain it to me like I have no idea (which I don't, it seems). Or point me to a thorough video, or readable tutorial.

All I find on the web is super simple examples, that didn't help me much. Or just very short definitions of classes and class methods instances etc.

I can send you my original code if you guys want, but its quite long.

Answer
class Foo          (object):
    # ^class name  #^ inherits from object

    bar = "Bar" #Class attribute.

    def __init__(self):
        #        #^ The first variable is the class instance in methods.  
        #        #  This is called "self" by convention, but could be any name you want.
        #^ double underscore (dunder) methods are usually special.  This one 
        #  gets called immediately after a new instance is created.

        self.variable = "Foo" #instance attribute.
        print self.variable, self.bar  #<---self.bar references class attribute
        self.bar = " Bar is now Baz"   #<---self.bar is now an instance attribute
        print self.variable, self.bar  

    def method(self, arg1, arg2):
        #This method has arguments.  You would call it like this:  instance.method(1,2)
        print "in method (args):", arg1, arg2
        print "in method (attributes):", self.variable, self.bar


a = Foo() # this calls __init__ (indirectly), output:
                 # Foo bar
                 # Foo  Bar is now Baz
print a.variable # Foo
a.variable = "bar"
a.method(1, 2) # output:
               # in method (args): 1 2
               # in method (attributes): bar  Bar is now Baz
Foo.method(a,1,2) #<--- Same as a.method(1, 2).  This makes it a little more explicit what the argument "self" actually is.

class Bar(object):
    def __init__(self, arg):
        self.arg = arg
        self.Foo = Foo()

b = Bar(a)
b.arg.variable = "something"
print a.variable # something
print b.Foo.variable # Foo
Comments