Parent instance attribute access
Gabriel Rossetti
gabriel.rossetti at mydeskfriend.com
Mon Feb 25 08:30:58 EST 2008
marek.rocki at wp.pl wrote:
> Hello. Please post the minimal code that can be run and demonstrates
> what's wrong. I tried the following and it works fine, args and kwargs
> are visible:
>
> class MyFactory(object):
> def __init__(self, *args, **kwargs):
> self.args = args
> self.kwargs = kwargs
>
> class MyXmlFactory(MyFactory):
> def __init__(self, *args, **kwargs):
> MyFactory.__init__(self, *args, **kwargs)
> def build(self, addr):
> p = self.toto(*self.args, **self.kwargs)
> return p
> def toto(self, *args, **kwargs):
> print 'args in toto:', args
> print 'kwargs in toto:', kwargs
> return 'ok'
>
> print MyXmlFactory(1, 2, 3, four = 4, five = 5).build(None)
>
Yes, I see, here is an example, it's using twisted, but I think it's a
python problem (that's why I wrote here). The code for the parent
classes is here
(http://twistedmatrix.com/trac/browser/trunk/twisted/words/xish/xmlstream.py)
xmlstream.XmlStreamFactory in the following code is supposed to be
MyFactory in the previous example, and MyXmlFactory is supposed to be
(xmlstream.XmlStreamFactory. If you uncomment the two commented lines in
MyXmlStreamFactory it works, if they are commented it doesn't. The
parent class (XmlStreamFactory) inherits from two classes :
XmlStreamFactoryMixin (where args and kwargs are defined)
and
protocol.ReconnectingClientFactory.
I think it may be because of the multiple inheritance that I'm getting
this, maybe since the child class doesn't define the __init__() method.
To test, run the following code in one terminal, and run :
netcat localhost 4321
in another (it will crash right away with the lines commented).
Thanks,
Gabriel
from twisted.words.xish import xmlstream
from twisted.internet import reactor
class XmlStreamTestSrv(xmlstream.XmlStream):
def __init__(self):
xmlstream.XmlStream.__init__(self)
def _onHeader(self, element):
print "got header from %s : %s" %
(str(self.transport.getPeer().host), element.toXml())
def connected(self, xs):
print 'Connection from %s!' % str(self.transport.getPeer().host)
xs.addObserver("/header", self._onHeader)
class MyXmlStreamFactory(xmlstream.XmlStreamFactory):
def __init__(self, *args, **kwargs):
xmlstream.XmlStreamFactory.__init__(self, *args, **kwargs)
#self.args = args
#self.kwargs = kwargs
self.protocol = XmlStreamTestSrv
def buildProtocol(self, addr):
self.resetDelay()
xs = self.protocol(*self.args, **self.kwargs)
xs.factory = self
self.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT, xs.connected)
for event, fn in self.bootstraps:
xs.addObserver(event, fn)
return xs
if __name__ == "__main__":
reactor.listenTCP(4321, MyXmlStreamFactory())
reactor.run()
More information about the Python-list
mailing list