global name 'self' is not defined - noob trying to learn
Dave Angel
davea at ieee.org
Mon Mar 30 14:53:19 EDT 2009
After taking out the class myclass stuff, the code worked for me in
Python 2.6.1, through the cat line. Could you please tell us what
version of Python you're running this on?
import sys
print "Python version: ", sys.version
yielded (on my machine)
Python version: 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500
32 bit (Intel)]
(There are two typos in Test 3, and in Test 4 you seem to be treating
this object like a list.)
mark.seagoe at gmail.com wrote:
> On Mar 30, 10:53 am, David Bolen <db3l.... at gmail.com> wrote:
>
>> mark.sea... at gmail.com writes:
>>
>>> class myclass(object):
>>> #
>>> # def __new__(class_, init_val, size, reg_info):
>>> def __init__(self, init_val, size, reg_info):
>>>
>>> # self =bject.__new__(class_)
>>> self.reg_info =eg_info
>>> print self.reg_info.message
>>> self.val =elf
>>>
>> Note that here you assign self.val to be the object itself. Are you
>> sure you didn't mean "self.val =nit_val"?
>>
>>
>>> (...)
>>> def __int__(self):
>>> return self.val
>>>
>> Instead of an integer, you return the current class instance as set up
>> in __init__. The __int__ method ought to return an integer.
>>
>>
>>> def __long__(self):
>>> return long(self.val)
>>>
>> And this will be infinite recursion, since long(<obj>) will try to
>> call the __long__ method on <obj> so you're just recursing on the
>> __long__ method.
>>
>> You can see this more clearly with:
>>
>> >>> cat =yclass(0x55, 32, my_reg)
>> >>> int(cat)
>> Traceback (most recent call last):
>> File "<stdin>", line 1, in <module>
>> TypeError: __int__ returned non-int (type myclass)
>> >>>
>>
>> I won't post the traceback for long(cat), as it's, well, "long" ...
>>
>> -- David
>>
>
> Hi David;
>
> Yep I had fixed up that version actually. Here is the latest.
>
> from ctypes import *
>
> class REG_INFO(Structure):
> _fields_ =
> ('address', c_ubyte),
> ('message', c_char * 256),
> ('size', c_ubyte)
> ]
>
> class myclass(object):
> #
> # def __new__(class_, init_val, size, reg_info):
> def __init__(self, init_val, reg_info):
>
> # self =bject.__new__(class_)
> self.reg_info =eg_info
> print reg_info.message
> self.val =nit_val
> self.size =eg_info.size
> self.addr =eg_info.address
> print 'address =x%02X' % self.addr
> # return self
> #
> def __getitem__(self, index): # gets a single bit
> if index >=elf.size:
> return self.val
> return (self.val >> index) & 1
> #
> def __get__(self): # gets a single bit
> return self.val
> #
> def __setitem__(self,index,value): # sets a single bit
> if index >=elf.size:
> self.val =alue
> return
> value =value&1L)<<index
> mask =1L)<<index
> self.val =self.val & ~mask) | value
> return
> #
> def __int__(self):
> return self.val
> #
> def __long__(self):
> return long(self.val)
>
> #
> #
> # setup
> my_reg =EG_INFO()
> my_reg.address =xab
> my_reg.message =hello world'
> my_reg.size =2
>
> print 'TEST 1'
> dog =x123456789ABCDEF0
> print 'type(dog) =s' % type(dog)
> print 'dog val =x%016X' % dog
>
> print 'TEST 2'
> cat =yclass(0x55, my_reg)
> print 'type(cat) =s' % type(cat)
> print 'cat val =x%016X' % cat
>
> print 'TEST 3'
> bird =yclass(dog, my_reg)
> print 'type(bird) =s' % type(bird)
> print 'bird val =x%016X' % bird
>
> print 'TEST 4'
> print bird
> print 'bird[0] val =x%01X' % bird[0]
> bird[0] =bird[0]
> print 'bird val =x%016X' % bird
> print 'bird[0] val =x%01X' % bird[0]
>
> When Run:
>
> TEST 1
> type(dog) =type 'long'>
> dog val =x123456789ABCDEF0
> TEST 2
> hello world
> address =xAB
> type(cat) =class '__main__.myclass'>
> cat val =x0000000000000055
> TEST 3
> hello world
> address =xAB
> type(bird) =class '__main__.myclass'>
> Traceback (most recent call last):
> File "C:\(big path)\bignum5.py", line 69, in <module>
> print 'bird val =x%016X' % bird
> TypeError: int argument required
>
>
More information about the Python-list
mailing list