MonkeySeeMonkeyCode
MonkeySeeMonkeyCode

Reputation: 401

Understanding variable scopes in python: An Exercise Program

This is an exercise that I wanted to try because I thought it was interesting. The exercise is unnecessarily complex for what it is doing, but it is trying to act as practice for understanding class, function and variable behavior in more complex python programs.

import os

class grabFile:
    fileObject = None
    def __init__(self, filename):
        self.fileObject = open(filename, "r")

    def getFile():
        return self.fileObject

class counter:
    fileC = None
    lineCount = 0
    def __init__(self, fileObject):
        self.fileC = fileObject

    def lineCounter(self):
        while True:
            self.fileC.readline()
            print(x)
        return lineCount


def Main():
    fileGrabber = grabFile("test.txt")
    fileObj = fileGrabber.getFile

    countObj = counter(fileObj)
    lineCount = countObj.lineCounter()
    print(lineCount)

Main()

However, when I run this, I get the following error:

Traceback (most recent call last):
  File "/home/may/Desktop/Tree/Programming/MiscProjects/TextAnalyzer.py", line 32, in <module>
Main()
  File "/home/may/Desktop/Tree/Programming/MiscProjects/TextAnalyzer.py", line 29, in Main
lineCount = countObj.lineCounter()
  File "/home/may/Desktop/Tree/Programming/MiscProjects/TextAnalyzer.py", line 19, in lineCounter
self.fileC.readline()
AttributeError: 'function' object has no attribute 'readline'
[Finished in 0.2s with exit code 1]

Can anyone help me understand this program fully? And also, although this is not the correct place to ask, offer any critique on styling or formatting of the program? Especially one the use of "self".

Thank you!

Upvotes: 0

Views: 59

Answers (1)

Malik Brahimi
Malik Brahimi

Reputation: 16711

I think you meant to call the method:

fileObj = fileGrabber.getFile()

And you need to change to instance method:

def getFile(self):
    return self.fileObject

And your line counter method needs some work:

def lineCounter(self):
    self.lineCount = len(self.fileC.readlines())
    return self.lineCount

Upvotes: 3

Related Questions