2013-08-21 34 views
1

我轉換這個「非面向對象」的代碼:爲什麼使用類?

from Tkinter import * 

root = Tk() 
frame = Frame(root) 
frame.pack() 

bottomframe = Frame(root) 
bottomframe.pack(side = BOTTOM) 

redbutton = Button(frame, text="Red", fg="red") 
redbutton.pack(side = LEFT) 

bluebutton = Button(frame, text="Blue", fg="blue") 
bluebutton.pack(side = LEFT) 

root.mainloop() 

此面向對象的代碼:

from Tkinter import * 
class Window(Frame): 
    def __init__(self, parent = None): 
     Frame.__init__(self, parent) 
     self.pack() 

     widget=Button(self,text="Red", fg = "red") 
     widget.pack(side = LEFT) 

     widget = Button(self, text ="Blue", fg = "blue") 
     widget.pack(side = RIGHT) 
if __name__== '__main__': 
    Window().mainloop() 

無論是片段彈出一個簡單的窗口在屏幕上。我的問題是,在這種情況下面向對象編程(即使用類)有什麼好處?

如果我想要生成3個其他窗口(使用類),但使用改變的按鈕顏色,我需要修改藍圖(即類)還是有任何方法可以在我調用類實例時執行此操作?

+3

閱讀和理解你想要達到的目標要容易得多。 –

+0

將來它更具可重用性,如果您在本模塊之外使用它,則可以以更易理解的方式引用課程中的對象。 – Ben

+0

真的嗎?因爲作爲一個非py用戶,我理解第一個示例中的每一行,而只理解第二個示例中的大部分行。 (什麼是'__name __ =='__ main __''?如果'Frame'是一個'Window',爲什麼我們可以在'Window()'上調用'Mainloop'?)我知道這些事情,但我的觀點是,面向對象的目標實際上是銷售面向對象的簡稱。 – Dan

回答

5

想想如果你有兩個帶有紅色按鈕和藍色按鈕的窗戶會發生什麼。你能看出爲什麼它可能有助於將它們封裝在一個對象內?

+0

如果我要創建另一個窗口,我想我必須在面向對象的情況下添加另一行'Window()。mainloop()',而另一個情況下,我將不得不再次寫入整個代碼。對? – multigoodverse

+2

更正或編寫返回另一個窗口對象的函數。 – aychedee

+0

@aychedee在我看來,函數本身並不是「OO」,但你說它提供了與OO一樣的好處。所以對我來說,這似乎並沒有回答這個問題。 – jpmc26

4

「面向對象的編程」不僅僅是使用class關鍵字編寫過程程序。當你有一個類時,它不是OOP,只有一次調用,而該類有一個方法,即__init__()。 「在這種情況下」沒有任何好處,而且你並沒有真正在做「面向對象編程」。

OOP的好處 - 正確完成 - 一般都是衆所周知的,但在我看來,主要的一點是降低代碼複雜性。

+1

準確。 OOP是您工具箱中的一個工具。你不能把它放在每一個問題上,並期望事情在不知道它有什麼好處的情況下神奇地改進。它不適合所有問題,比如編程中的其他所有問題。 – jpmc26

1

下面可能是一個階級結構

from Tkinter import * 
class Window(Frame): 
    def __init__(self, parent = None): 
     Frame.__init__(self, parent) 
     self.pack() 

    def createButton(self, text, fg, side): 
     widget = Button(self, text = text, fg = fg) 
     widget.pack(side = side) 

if __name__== '__main__': 
    _win = Window() 
    _win.createButton("Red", "red", LEFT) 
    _win.createButton("Blue", "blue", RIGHT) 
    _win.mainloop() 

的用例但是,這是一個簡單的短代碼。對於冗長而複雜的代碼,它可以幫助您定義類變量並通過類中的任何函數實現它們。你也可以創建可重用的函數,並且在你的例子中刪除重複的行。

最好是閱讀有關OOP的更多信息,因爲在這裏講述所有方面並不簡單。

相關問題