通过类传播变量

  • 本文关键字:变量 传播 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。除了制作全局变量(我知道这很糟糕!)有没有一种方法可以从C调用a而不必通过调用传播变量?还是同样糟糕?(我确信这表明我对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_()

您可能在这里寻找类似多态性的东西。

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, B基于A。这允许C继承A和B的值,B继承A的值。

这显然会把解决方案颠倒过来,因为你需要先调用C而不是A。

这里的另一个变化是使用self关键字将变量a赋值给类本身。

最新更新