为什么python类中的某些函数需要使用括号而其他函数不要

时间:2017-04-12 10:50:56

标签: python class pandas

下面我定义了一个带有一些功能的基本类。

我不确定从一个函数传递数据的最佳方法是在另一个函数中使用。

我的解决方案是将数据帧作为参数传递给函数。我相信有一种更好,技术更正确的方式,所以请把它叫出来。

我想要理解的是为什么类中的某些函数在调用它们时需要使用(),而其他函数只能使用函数名称来调用。

启动名为“market”的ASX对象后,两个例子是:

  1. market.all_companies()
  2.   

    返回:数据框

    1. market.valid_industry
    2.   

      返回一个系列

      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
      

1 个答案:

答案 0 :(得分:1)

所有功能都需要(),但您在__init__中做了一些讨厌的事情,用系列替换了函数。

self.valid_industry = self.valid_industry(df)

这将覆盖函数valid_industry,使其不再是已创建实例的函数,而是从self.valid_industry(df)返回的值

不要对会员属性和方法使用相同的名称,所有这些都是有意义的。

对于您的方法,您不需要传递df作为参数,因为您已将其分配给self.companies,因此您的

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

变为:

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