2013-08-21 22 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的更多信息,因为在这里讲述所有方面并不简单。

相关问题