2015-01-08 35 views
2

我是 Python编程新手,目前正在开发一个小型的PyGTK应用程序。PyGTK应用程序的主类是否应该扩展Gtk.Window?

在搜索并阅读各种在线教程后,我对定义主应用程序的类感到有点困惑。我已经看到了两种不同的方法分别是:

import pygtk 
pygtk.require('2.0') 
import gtk 

class Base: 
    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.show() 

    def main(self): 
     gtk.main() 

print __name__ 
if __name__ == "__main__": 
    base = Base() 
    base.main() 

源:http://www.pygtk.org/pygtk2tutorial/ch-GettingStarted.html

......或者......

import gtk 

class PyApp(gtk.Window): 
    def __init__(self): 
     super(PyApp, self).__init__() 

     self.connect("destroy", gtk.main_quit) 
     self.set_size_request(250, 150) 
     self.set_position(gtk.WIN_POS_CENTER) 
     self.show() 

PyApp() 
gtk.main() 

源:http://zetcode.com/gui/pygtk/firststeps/

我明白了一个的主要类扩展另一个/使用它作为一个基础对象,但我不明白在这里的一种方法的好处,谁能解释一下吗?

回答

2

在pygtk中,你可以继承任何小部件,但在这种情况下,第二个实现比第一个具有优势。 OOP编程中的一个重要概念是encapsolate,指的是如何访问类属性/属性和方法。在代码的两种实现上,窗口是公开的,程序员可以直接访问窗口。 OOP编程来为我们,如果你想获得窗口实例的标题必须键入使用对象容易互动,在第一次执行:

base.window.get_title() 

,但在第二,你必须键入:

PyApp().get_title() 

也您可以将自定义属性,属性和方法附加到您需要的第二个实现,或者覆盖这些继承自父项的事物,例如,您可以将主要方法添加到PyApp类似如下:

import gtk 

class PyApp(gtk.Window): 
    def __init__(self): 
     super(PyApp, self).__init__() 

     self.connect("destroy", gtk.main_quit) 
     self.set_size_request(250, 150) 
     self.set_position(gtk.WIN_POS_CENTER) 
     self.show() 

    def main(self): 
     gtk.main() 

app = PyApp() 
app.main() 

但如果你想被别人程序员没有直接访问到窗口共享这个类,第一个实现当然是加下面的代码类似的微小变化的更好:

import pygtk 
pygtk.require('2.0') 
import gtk 

class Base: 
    def __init__(self): 
     self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.__window.show() 

    def main(self): 
     gtk.main() 

print __name__ 
if __name__ == "__main__": 
    base = Base() 
    base.main() 

任何属性之前双下划线属性和methodes变化这些私人的范围。

相关问题