PyGTK 应用程序的 main class 是否应该扩展 Gtk.Window?

Should a PyGTK application's main class extend Gtk.Window or not?

非常 Python 编程新手,目前正在开发一个小型 PyGTK 应用程序。

在搜索和阅读各种在线教程后,我对定义主应用程序的 class 感到有些困惑。我见过的两种不同的方法是:

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/

我理解一种方法的原理 class 扩展另一种方法/将其用作基础对象,但我不清楚一种方法相对于另一种方法的好处,谁能解释一下?

在 pygtk 中,您可以继承任何小部件,但在这种情况下,第二种实现比第一种具有优势。 OOP 编程中的一个重要概念是封装,它指的是如何访问 class properties/attributes 和方法。在这两种代码的实现上,window是public,程序员可以直接访问window。 OOP 编程的出现是因为我们与 objects 交互很容易,在第一次实现时,如果你想获得 window 实例的标题,你必须键入:

base.window.get_title()

但是在第二个你必须输入:

PyApp().get_title()

您还可以将自定义属性、特性和方法附加到您需要的第二个实现或覆盖从 parent 继承的这些东西,例如,您可以将 main 方法添加到 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()

但是如果你想在没有直接访问 window 的情况下由其他程序员共享这个 class,当然第一个实现更好加上类似下面代码的微小变化:

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()

在任何特性、属性和方法将它们的范围更改为私有之前加双下划线。