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()
在任何特性、属性和方法将它们的范围更改为私有之前加双下划线。
我非常 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()
在任何特性、属性和方法将它们的范围更改为私有之前加双下划线。