Python3类实例可以在初始化时被强制为全局对象吗?

时间:2017-07-12 08:56:04

标签: python-3.x class oop initialization global-variables

尽管全局Python对象往往很糟糕,但我或多或少被迫将它们与模块curses一起使用。我目前有这个:

class Window:
    def __init__(self, title, h, w, y, x):
        self.window = curses.newwin(h, w, y, x)
        self.window.box()
        self.window.hline(2, 1, curses.ACS_HLINE, w-2)
        self.window.addstr(1, 2, title)
        self.window.refresh()

global top_win
top_win = Window('Top window', 6, 32, 3, 6)

我想知道是否可以通过在类定义或初始化中添加内容来摆脱global行?

class Window:
    def __init__(self, title, h, w, y, x):
        # Some global self magic
        self.window = curses.newwin(h, w, y, x)
        self.window.box()
        self.window.hline(2, 1, curses.ACS_HLINE, w-2)
        self.window.addstr(1, 2, title)
        self.window.refresh()

top_win = Window('Top window', 6, 32, 3, 6)

1 个答案:

答案 0 :(得分:0)

全球班级模式

尽管只要看到global这个词就反复下来,但无论如何我通过应用equally controversial global class pattern解决了我的问题。

class win:
    pass

class Window:
    def __init__(self, title, h, w, y, x):
        self.window = curses.newwin(h, w, y, x)
        self.window.box()
        self.window.hline(2, 1, curses.ACS_HLINE, w-2)
        self.window.addstr(1, 2, title)
        self.window.refresh()

win.top = Window('Top window', 6, 32, 3, 6)

这导致win.top可以在我的Python脚本中的任何位置访问,就像任何global变量一样,但是以更加可控的方式很好又整洁。

这对于在curses例程中定义新main()窗口非常方便,curses.wrapper(main)例程通常包含在debug内。请点击此链接查看full blown Python3 curses example