通过类传播变量

时间:2014-08-05 16:50:15

标签: python

如果我有以下代码

class A:
  def __init__(self):
    a = 1
    self.b = B(a)

class B:
  def __init__(self,i):
    self.c = C(i)

class C:
  def __init__(self,j):
    print j

if __name__ == '__main__':
  A()

然后运行该程序将打印1。除了制作全局变量(我知道这很糟糕!)有没有办法从a调用C而不必通过调用传播变量?或者那同样糟糕? (我确信这在我的OO理解中显示出明显的差距,但这一直是我心中的一个问题...)

真实世界的例子

嗯,我不认为自己是一名程序员(虽然这是我最终做的事情),所以我知道我的理解存在很大差距。我希望这个例子能说明我要问的问题。在这种情况下,我想知道是否有一种方法可以直接在Browser中调用服务器端口号,而无需通过webwidget发送变量。也许这个例子有点做作,代码可以用更好的方式重写......

import BaseHTTPServer, CGIHTTPServer, os, sys
from PyQt4 import QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *  
from PyQt4.QtWebKit import QWebView
from PyQt4.QtNetwork import *

class server:

  def initServer(self):
    server = BaseHTTPServer.HTTPServer
    httpd = server(("",0), CGIHTTPServer.CGIHTTPRequestHandler)
    return httpd

class wrapper(QMainWindow):

  def __init__(self):
    super(wrapper, self).__init__()
    self.createActions()
    self.createToolbar()
    self.cs = server().initServer()

  def createToolbar(self):
    self.toolbar = self.addToolBar("MainMenu")
    self.toolbar.addAction(self.web)

  def createActions(self):
    self.web = QAction("web", self, triggered=self.webwidget)

  def webwidget(self):
    self.webw = webwidget(self.cs.server_port)
    self.setCentralWidget(self.webw)

class webwidget(QWidget):

  def __init__(self,port):
    super(webwidget, self).__init__()

    self.b = Browser(port)
    self.grid = QGridLayout()
    self.grid.addWidget(self.b,0,1)
    self.setLayout(self.grid)

class Browser(QWebView):

  def __init__(self,port):
    QWebView.__init__(self)
    self.load(QUrl('http://localhost:'+str(port)+'/test.htm'))
    self.loadFinished.connect(self._result_available)

  def _result_available(self, ok):
    frame = self.page().mainFrame()

if __name__ == '__main__':
  app = QApplication(sys.argv)
  gui = wrapper()
  gui.show()
  app.exec_()

1 个答案:

答案 0 :(得分:2)

您可能正在寻找类似Polymorphism的内容。

class A(object):
  def __init__(self):
    self.a = 1

class B(A):
  def __init__(self):
    super(B, self).__init__()

class C(B):
  def __init__(self):
    super(C, self).__init__()
    print self.a

if __name__ == '__main__':
  C()

在这种情况下,C基于B,然后基于A.这允许C继承A和B的值,B继承A的值。

这显然会解决问题,因为你需要先调用C而不是A。

此处的另一个变化是使用self关键字将变量a分配给类本身。