Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
176 views
in Technique[技术] by (71.8m points)

python - Using Class, Methods to define variables

I have a number of chemicals with corresponding data held within a database, how do I go about returning a specific chemical, and its data, via its formula, eg o2.

class SourceNotDefinedException(Exception):
def __init__(self, message):
    super(SourceNotDefinedException, self).__init__(message)

class tvorechoObject(object):
"""The class stores a pair of objects, "tv" objects, and "echo" objects. They are accessed
simply by doing .tv, or .echo. If it does not exist, it will fall back to the other variable.
If neither are present, it returns None."""
def __init__(self, echo=None, tv=None):
    self.tv = tv
    self.echo = echo

def __repr__(self):
    return str({"echo": self.echo, "tv": self.tv}) # Returns the respective strings

def __getattribute__(self, item):
    """Altered __getattribute__() function to return the alternative of .echo / .tv if the requested
    attribute is None."""

    if item in ["echo", "tv"]:    
        if object.__getattribute__(self,"echo") is None: # Echo data not present
            return object.__getattribute__(self,"tv") # Select TV data
        elif object.__getattribute__(self,"tv") is None: # TV data not present
            return object.__getattribute__(self,"echo") # Select Echo data
        else:
            return object.__getattribute__(self,item) # Return all data

    else:
        return object.__getattribute__(self,item) # Return all data


class Chemical(object):
    def __init__(self, inputLine, sourceType=None):
        self.chemicalName = TVorEchoObject()    
        self.mass = TVorEchoObject()
        self.charge = TVorEchoObject()


        self.readIn(inputLine, sourceType=sourceType)

def readIn(self, inputLine, sourceType=None):

    if sourceType.lower() == "echo": # Parsed chemical line for Echo format 


        chemicalName            = inputLine.split(":")[0].strip()
        mass               = inputLine.split(":")[1].split(";")[0].strip()
        charge                 = inputLine.split(";")[1].split("]")[0].strip()


        # Store the objects
        self.chemicalName.echo = chemicalName
        self.mass.echo = mass
        self.charge.echo = charge


    elif sourceType.lower() == "tv": # Parsed chemical line for TV format


        chemicalName          = inputLine.split(":")[0].strip()
        charge               = inputLine.split(":")[1].split(";")[0].strip()
        mass                 = inputLine.split(";")[1].split("&")[0].strip()


        # Store the objects
        self.chemicalName.tv = chemicalName
        self.charge.tv = charge
        self.mass.tv  = molecularWeight

    else:
        raise SourceNotDefinedException(sourceType + " is not a valid `sourceType`") # Otherwise print 


def toDict(self, priority="echo"):
    """Returns a dictionary of all the variables, in the form {"mass":<>, "charge":<>, ...}.
    Design used is to be passed into the Echo and TV style line format statements."""
    if priority in ["echo", "tv"]:
    # Creating the dictionary by a large, to avoid repeated text
        return dict([(attributeName, self.__getattribute__(attributeName).__getattribute__(priority))
            for attributeName in ["chemicalName", "mass", "charge"]])
    else:
        raise SourceNotDefinedException("{0} source type not recognised.".format(priority)) # Otherwise print






from ParseClasses import Chemical
allChemical = []
chemicalFiles = ("/home/temp.txt")


for fileName in chemicalFiles:
    with open(fileName) as sourceFile:
        for line in sourceFile:
        allChemical.append(Chemical(line, sourceType=sourceType))

for chemical in allChemical:
    print chemical.chemicalName #Prints all chemicals and their data in list format

for chemical in allChemical(["o2"]):
    print chemical.chemicalName

outputs the following error which I have tried to remedy with no luck; TypeError: 'list' object is not callable

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The issue is the two lines

for chemical in allChemical(["o2"]):
    print chemical.chemicalName

allChemical is a list, and you can't just do a_list(). It looks like you're trying to find either ['o2'] or just 'o2' in a list. To do that, you can get the index of the item and then get that index from the list.

allChemical[allChemical.index("o2")]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...