2016-11-26 78 views
0

我有一個函數(get_score)使用來自其他函數(self .__ sma)的變量在同一個類中。如何從python中的其他函數訪問變量

我的問題:如何從get_score函數訪問這些變量? (錯誤:未定義全局名稱)。

而且,我聽說使用全局變量導致shitstorm(從我這裏閱讀只是爲基礎)。提前致謝。

下面是一些代碼:

testlist = ['TREE', 'HAPPY'] 
Class MyStrategy(strategy.BacktestingStrategy): 
    def __init__(self, feed, instrument): 
     super(MyStrategy, self).__init__(feed, 1000) 
     self.__position = [] #None 
     self.__instrument = instrument 
     self.setUseAdjustedValues(True) 
     self.__prices = feed[instrument].getPriceDataSeries() 
     self.__sma = ma.SMA(feed[instrument].getPriceDataSeries(), smaPeriod) 

    def get_score(self,banana) 
     fruit_lover= self.__sma 
     return fruit_lover + banana 

    def onBars(self, bars): 
     for x in bars.getInstruments(): 

      list_large = {} 
      for y in testlist: 
       list_large.update({y : self.get_score(5)}) 
+1

我已經看過好幾個這樣的問題,先詢問後再搜索 – Eric

+0

我做了,我實際上很難過這個......一個鏈接會很棒......找到幾頁,但它仍然沒有加工。 – RageAgainstheMachine

+0

一個名爲'get_score'的函數應該得到/返回一個分數,而不是設置一些變量。隨着這一點,'{y:self.get_score(5)}'將'y'設置爲'None' –

回答

1

隨着你的腳本的副本,和一堆存根,和太多的語法更正:

testlist = ['TREE', 'HAPPY'] 
class MyStrategy(): #strategy.BacktestingStrategy): # lowercase class 
    def __init__(self, feed, instrument): 
     #super(MyStrategy, self).__init__(feed, 1000) 
     self.__position = [] #None 
     self.__instrument = instrument 
     #self.setUseAdjustedValues(True) 
     self.__prices = 123 #feed[instrument].getPriceDataSeries() 
     self.__sma = 100 # ma.SMA(feed[instrument].getPriceDataSeries(), smaPeriod) 

    def get_score(self,banana): # add : 
     fruit_lover= self.__sma 
     return fruit_lover + banana 

    def onBars(self, bars): 
     #for x in bars.getInstruments(): 
     list_large = {} 
     for y in testlist: 
      list_large.update({y : self.get_score(5)}) 
     self.list_large = list_large # save list_large 
s = MyStrategy('feed', 'inst') 
print(vars(s))   # look at attributes set in __init__ 
print(s.get_score(10)) # test get_score by itself 
s.onBars('bars')   # test onBars 
print(s.list_large) 

我得到以下運行:

0009:~/mypy$ python stack40814540.py 
{'_MyStrategy__position': [], 
'_MyStrategy__instrument': 'inst', 
'_MyStrategy__sma': 100, 
'_MyStrategy__prices': 123} 
110 
{'TREE': 105, 'HAPPY': 105} 

我在其他方法中訪問__sma屬性沒有問題。

由於名稱與__(而不是結束__)啓動時,它被編碼爲「僞私有」的變量,如可以在vars顯示器看到。但是這並不妨礙其他方法的訪問。

對於初學者,我建議跳過該功能,並使用self.sma等名稱。代碼將更容易調試。

確保您瞭解我的更改;並運行一些類似的測試。