2017-03-14 24 views
-1

我試圖使用連接到一個數據庫sqllite:如何在命令行中運行Python類方法

class Sqllite_utilities(object): 

    def __init__(self): 

     parser = argparse.ArgumentParser() 
     parser.add_argument("-s","--source", type=str, 
          help="source table from db") 
     args = parser.parse_args() 
     print(args) 


     source_table= args.source 

     db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db" 

     dataset_db = dataset.connect(db_path) 
     self.dataset_table = dataset_db[source_table] 


    def missing_ids(self): 

     for user in self.dataset_table: 
      print(user['id']) 


if __name__ == '__main__': 
    Sqllite_utilities.missing_ids(sys.argv[1]) 

當我這樣做:

$ python find_missing_records.py -s test 

我得到:

Traceback (most recent call last): 
    File "find_missing_records.py", line 41, in <module> 
    Sqllite_utilities.missing_ids(sys.argv[1]) 
TypeError: unbound method missing_ids() must be called with Sqllite_utilities instance as first argument (got str instance instead) 
(contact2E) 

我做錯了什麼?

回答

4

在做:

Sqllite_utilities.missing_ids(sys.argv[1]) 

你調用sys.argv[1](字符串)爲selfmissing_ids實例方法(功能性的方式來調用實例方法,但用錯了對象),這也解釋了錯誤信息。

很明顯,你必須能夠使用的實例方法(包括那些沒有@staticmethod@classmethod裝飾)之前創建的對象的實例

if __name__ == '__main__': 
    s = Sqllite_utilities() 

構造解析這些參數,使用argparse.ArgumentParser默認情況下使用sys.argv,所以將它放在一邊,它會起作用。

然後調用實例的方法:

s.missing_ids() 

sself隱式傳遞調用missing_ids

+0

謝謝你的作品。關於「很明顯,你必須在能夠使用實例方法(沒有static方法或類方法裝飾器的方法)之前創建對象的實例」,你是否說類和靜態方法不需要類是首先實例化,但其他方法呢? – user61629

+0

是的,你可以使用沒有任何實例的類/靜態方法。 –

+0

謝謝,這有助於我的理解。 – user61629