如果我有以下代码
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_()
答案 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
分配给类本身。