2014-01-23 130 views
0
class Switch(): 

    def __init__(self, mode): 
     self._mode = mode 
     if self._mode == '1': 
      self._mode = True 
     if self._mode == '0': 
      self._mode = False 

    def flip(self): 
     if self._mode is True: 
      self._mode = False 
     if self._mode is False: 
      self._mode = True 


class Flip(): 

    def __init__(self, lst): 
     self._lst = [] 
     for i in range(lst): 
      self._lst.append(False) 

    def flip(self, n): 
     self._lst[n] = Switch.flip(self) #problem here 

到目前爲止,我所遇到的問題是當我從另一個類調用某個函數時,它會引發錯誤。調用另一個類的方法

什麼開關類做:

如果你通過「1」作爲參數,將其更改爲真,如果你將「0」,因爲它會改變它爲False參數。在開關的翻轉方法改變了模式,所以如果這是真的,將其更改爲False,等

什麼翻轉類做:

如果傳遞一個數字作爲參數,它會創建一個列表許多元素,而不是數字,它會將False置於原地。恩。如果你通過10,而不是[0,1,2,3,4,5,6,7,8,9]你會得到[假,假,假,假,...]。 Flip中的翻轉方法將從Switch調用flip方法,並在給定索引處更改它的狀態。防爆。 [假,假,假,你調用翻蓋2爲n,那麼你會得到[假,假,真]

然而,當我.flip(2)它拋出一個錯誤:

f1 = Flip(10) 
f1.flip(2) 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module> 
    # Used internally for debug sandbox under external interpreter 
    File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 25, in flip 
    File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 11, in flip 
builtins.AttributeError: 'Flip' object has no attribute '_mode' 

不知道爲了解決這個問題需要更改什麼。類是新的對我來說不是很確定:/

回答

0

你需要創建一個mode變量通過了Switch對象,並刪除self變量傳遞到:

self._lst[n] = Switch.flip(self) #problem here 

因此,它應該是這樣的:

sw = Switch(mode) 
self._lst[n] = sw.flip() 
+0

我得到:builtins.TypeError:翻轉()失蹤1個人需要的位置參數: '自我' – Sc4r

+0

@ sc4r更新答案 –

1

你有兩個問題(看下面的修改後的代碼,我的兩條意見一起 - 在我所做的更改)。

class Switch(): 

    def __init__(self, mode): 
     self._mode = mode 
     if self._mode == '1': 
      self._mode = True 
     if self._mode == '0': 
      self._mode = False 

    def flip(self): 
     if self._mode is True: 
      self._mode = False 
     if self._mode is False: 
      self._mode = True 
     return self._mode # need to return this for Flip class's method 

class Flip(): 

    def __init__(self, lst): 
     self._lst = [] 
     for i in range(lst): 
      self._lst.append(False) 

    def flip(self, n): 
     # need to initialize Switch with the current mode 
     self._lst[n] = Switch(self._lst[n]).flip() 

而且,所有的Python類應該從object或後代繼承(但沒有任何與您的問題做)。

+0

謝謝Gerrat,這似乎解決了我問題:) – Sc4r

+1

你可以簡化你的'flip'方法,以便它只是'self._mode = not self._mode'並擺脫你的if語句嗎? – elParaguayo

1

我認爲你應該重新考慮你的班級設計。這可能只是幫助自學課程的一個例子。確定什麼應該成爲一類的一種方法稱爲「名詞提取」。首先創建一個系統工作原理的敘述(例如,「當一個人翻轉一個開關,一個燈打開或關閉」)然後提取名詞列表:人,開關,光。你的課程將是這些名詞的一個子集。動詞(翻轉,打開,關閉)成爲這些類中的方法。

我認爲你的Switch類可以解決大部分你需要的問題。 Flip類可能會被刪除。你可以在其上創建與你的代碼和運行方式交換機對象:

myswitch = Switch(1) 
print myswitch._mode 
myswitch.flip() 
print myswitch._mode 
0

要調用flip()方法,你需要有類Switch的實例作爲大多數的答案已經說。通過Python documentation on Class Objects閱讀應該給你一個好的開始。

雖然您有其他幾個與此代碼混淆的機會。這是一個實現,它解決了將來可能會對您造成的一些問題。

變化

  • 使用not而不是使用條件句代表所有真/假值的開關類內部布爾
  • 布爾值可以反轉
  • 增加了__str__返回該實例的字符串表示形式,用於調試
  • (高級)在Flip構造函數中使用list comprehension而不是循環。所有pythonic和這樣和soforth。

和使用:

f = Flip(5) 
print f 
#outputs 
#Switches:----- 

f.flip(1) 
f.flip(3) 
f.flip(4) 
print f 
#outputs 
#Switches:-1-11 

f.flip(3) 
f.flip(4) 
print f 
#outputs 
#Switches:-1---