yoshiserry
yoshiserry

Reputation: 21355

why do some functions within a python class require the use of brackets and others dont

Below I have defined a basic class with some functions.

I am not sure of the best way to pass data from one function to be used in another.

My solution was to pass a dataframe as a parameter to the function. I am sure there is a better and more technically correct way so please call it out.

What I am trying to understand is why some functions in the class require the () to be used when calling them and others you can call just using the function name.

Once a ASX object called "market" is initiated The two examples are:

  1. market.all_companies()

Returns: a dataframe

  1. market.valid_industry

returns a series

class YourError( Exception ): pass

class asx(object):

    def __init__(self, name):
        try:
            #initialise
            self.name = name

            #all companies on asx downloaded from asx website csv
            df = pd.read_csv('http://asx.com.au/asx/research/ASXListedCompanies.csv', skiprows=1)
            df.columns = ["company","asx_code","industry"]
            df["yahoo_code"] = df["asx_code"]+".AX"

            self.companies = df
            self.industry = self.all_industry(df)
            self.valid_stocks = self.valid_stocks(df)
            self.valid_industry = self.valid_industry(df)

        except: 
            raise YourError("asx companies CSV not available")

    def all_companies(self):
        return self.companies

    def valid_industry(self,df):
        return df["industry"].value_counts()

    def all_industry(self,df):
        return df["industry"].value_counts()

    def valid_stocks(self,df):
        return df[(df["industry"]!= "Not Applic") & (df["industry"]!="Class Pend")]

market = asx("asx")
market.all_companies()
market.valid_industry

Upvotes: 0

Views: 106

Answers (1)

user3012759
user3012759

Reputation: 2095

All functions require () but you're doing some nasty stuff in you __init__ where you replace function with a series.

self.valid_industry = self.valid_industry(df)

this will overwrite the function valid_industry to no longer be a function on the instance created but to be value returned from self.valid_industry(df)

don't use same name for member properties and methods and all will make sense.

For your methods you don't need to pass in df as argument as you have it assigned to self.companies so your

def valid_industry(self,df):
    return df["industry"].value_counts()

becomes:

def valid_industry(self):
    return self.companies["industry"].value_counts()

Upvotes: 1

Related Questions