Writing and importing custom modules/classes
Question: I've got a class that I'm trying to write called dbObject and I'm trying to
import it from a script in a different folder. My structure is as follows:

    
    
    /var/www/html/py/testobj.py
    
    /var/www/html/py/obj/dbObject.py
    
    /var/www/html/py/obj/__init__.py
    

Now, `__init__.py` is an empty file. Here are the contents of dbObject.py:

    
    
    class dbObject:
            def __init__():
                    print "Constructor?"
    
            def test():
                    print "Testing"
    

And here's the contents of testobj.py:

    
    
    #!/usr/bin/python
    import sys
    sys.path.append("/var/www/html/py")
    import obj.dbObject
    
    db = dbObject()
    

When I run this, I get:

    
    
    Traceback (most recent call last):
      File "testobj.py", line 7, in <module>
        db = dbObject()
    NameError: name 'dbObject' is not defined
    

I'm new to Python, so I'm very confused as to what I'm doing wrong. Could
someone please point me in the right direction?

EDIT: Thanks to Martijn Pieters' answer I modified my testobj.py as follows:

    
    
    #!/usr/bin/python
    import sys
    sys.path.append("/var/www/html/py")
    sys.path.append("/var/www/html/py/dev")
    from  obj.dbObject import dbObject
    
    db = dbObject()
    

However, now when I run it I get this error:

    
    
    Traceback (most recent call last):
      File "testobj.py", line 7, in <module>
        db = dbObject()
    TypeError: __init__() takes no arguments (1 given)
    

Is this referring to my **init**.py or the constructor within dbObject?

EDIT(2): Solved that one myself, the constructor must be able to take at least
one parameter - a reference to itself. Simple fix. Looks like this problem is
solved!

EDIT (Final): This is nice - I can cut out the import sys and sys.path.append
lines and it still works in this instance. Lovely.


Answer: You need to import the class from the module:

    
    
    from obj.dbObject import dbObject
    

This adds the class `dbObject` directly to your local namespace.

Your statement `import obj.dbObject` adds the name `obj` to the local
namespace, so you could also do this instead:

    
    
    db = obj.dbObject.dbObject()
    

because `obj.dbObject` is the `dbObject.py` module in your `obj` package
directory.

