inheritance and how to use it

Bob Brusa bob.brusa at gmail.com
Fri Feb 15 13:28:50 EST 2013


Am 15.02.2013 19:03, schrieb Dave Angel:
> On 02/15/2013 12:23 PM, Bob Brusa wrote:
>> Am 15.02.2013 18:11, schrieb Dave Angel:
>>> On 02/15/2013 11:59 AM, Bob Brusa wrote:
>>>> Hi,
>>>> I use a module downloaded from the net. Now I want to build my own
>>>> class, based
>>>> on the class SerialInstrument offered in this module - and in my class
>>>> I would
>>>> like to initialize a few things, using e. g. the method clear()
>>>> offered by
>>>> SerialInstrument. Hence I type:
>>>>
>>>> class myClass(SerialInstrument)
>>>>       self.clear(self)
>>>>       def f1(self, str1, str2)
>>>>           ...do something etc.
>>>>
>>>> I then get the message "self not know" from the statement
>>>> self.clear(self). I
>>>> have tried many other notations - none worked. What works is however
>>>> the
>>>> following code - specifying myClass without the self.clear(self) in it:
>>>>
>>>> x = myClass("argument")
>>>> x.clear()
>>>>
>>>> How can I integrate this call into the definition of myClass? Thanks
>>>> for advice.
>>>> Bob
>>>>
>>>>
>>>>
>>>
>>> By initialize, I'll assume you want this code to execute when your class
>>> is instantiated.  The way to do that is with a method called __init__().
>>>   Notice the double underscore at begin and end.
>>>
>>> class myClass(SerialInstrument):
>>>      def __init__(self):
>>>          self.val1 = 42
>>>          self.val2 = 31
>>>      #...   also initialize the base class
>>>          self.clear()
>>>
>>>      def f1(self, str1, str2):
>>>              ....
>>>
>>> You should also call the __init__() method of the base class.  But I
>>> don't know whether you're using Python2 or Python3, so I won't write
>>> that call
>>>
>>> This is without knowing anything about your base class, so there may be
>>> many other adjustments to be made.
>>>
>>>
>>>
>>>
>> I defined (which should clear visa-buffers when instantiating the class):
>>
>> class myvisa(visa.SerialInstrument):
>>      def __init__ (self):
>>          self.clear()
>
> I still don't see the call to the superclass __init__().  Get that code
> from Bob Brusa's message.
>
>>
>>      def io (self, printstr, askstr):
>> ...cut
>> when I run (python 2.7) a program using this class I get this:
>>
>> C:\Projekte\TDSsw\mypython>python chk_clear_1.py
>> Traceback (most recent call last):
>>    File "chk_clear_1.py", line 8, in <module>
>>      from myvisa import *
>>    File "C:\Projekte\TDSsw\mypython\myvisa.py", line 15, in <module>
>>      class myvisa(visa.SerialInstrument):
>>    File "C:\Projekte\TDSsw\mypython\myvisa.py", line 121, in myvisa
>>      visa.Instrument.clear()
>> TypeError: unbound method clear() must be called with Instrument
>> instance as first argument (got nothing instead)
>>
>> would it help to define instead:
>>
>> class myvisa(visa.SerialInstrument):
>>      def __init__ (self):
>>      x = SerialInstrument(self)
>>          x.clear()    #and then forget about this x?
>>
>>      def io (self, printstr, askstr):
>> ...cut
>>
>
> Besides being indented wrong (did you even try it ?), that code doesn't
> begin to be what you want.  You're calling clear on some other instance,
> then throwing that instance away, and not clearing the one you just
> created.
>
> But as I said before, you haven't said word-one about what the base
> class looks like, or how it's supposed to be used, nor when clear() is
> supposed to be called.
>
> You also aren't showing us the code which got the error, so I can't see
> how we could help.  What does the code around line 115 look like?  Is it
> part of the same class definition?
>
>
>
Dave,
to make it more clear, I attach a cut-down version of my program. It 
includes comments to explain in more detail what my problem is.
Bob

-------------- next part --------------
"""/
edit history:
15-02-2013  Creation
"""

import sys
import visa
import time


class myvisa(visa.SerialInstrument):
    """provide utilities to handle the instrument
    """
#    def __init__ ():   this doe not work
#        self.clear()

    def io (self, printstr, askstr):
        """combines a print and an ask-string into a single call
        """
        res = 0
        try:
            antw = self.ask(askstr)
        except:
            antw = "time-out"
            res = 1
        print printstr + antw
        return res

strich = " | "; pfeil = "->"
print "start of program q1.py"
iodev = "COM9"
tds = myvisa(iodev, baud_rate = 57600)
tds.clear() # this call I want to be called automatically when instantiating the class
cmd = "*idn?"; tds.io(pfeil+cmd+strich,cmd)
cmd = "status?"; tds.write(cmd)     # exit with something in the visa-buffer and this will
                                    # lead to a de-chronization between write and reads when 
                                    # executing a next program
print "end of program"



More information about the Python-list mailing list