global name 'self' is not defined - noob trying to learn

mark.seagoe at gmail.com mark.seagoe at gmail.com
Mon Mar 30 20:03:14 CEST 2009


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 = object.__new__(class_)
> >         self.reg_info = reg_info
> >         print self.reg_info.message
> >         self.val = self
>
> Note that here you assign self.val to be the object itself.  Are you
> sure you didn't mean "self.val = init_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 = myclass(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 = object.__new__(class_)
        self.reg_info = reg_info
        print reg_info.message
        self.val = init_val
        self.size = reg_info.size
        self.addr = reg_info.address
        print 'address = 0x%02X' % self.addr
        # return self
#
    def __getitem__(self, index): # gets a single bit
        if index >= self.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 >= self.size:
            self.val = value
            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 = REG_INFO()
my_reg.address = 0xab
my_reg.message = 'hello world'
my_reg.size = 32

print 'TEST 1'
dog = 0x123456789ABCDEF0
print 'type(dog) = %s' % type(dog)
print 'dog val = 0x%016X' % dog

print 'TEST 2'
cat = myclass(0x55, my_reg)
print 'type(cat) = %s' % type(cat)
print 'cat val = 0x%016X' % cat

print 'TEST 3'
bird = myclass(dog, my_reg)
print 'type(bird) = %s' % type(bird)
print 'bird val = 0x%016X' % bird

print 'TEST 4'
print bird
print 'bird[0] val = 0x%01X' % bird[0]
bird[0] = ~bird[0]
print 'bird val = 0x%016X' % bird
print 'bird[0] val = 0x%01X' % bird[0]

When Run:

TEST 1
type(dog) = <type 'long'>
dog val = 0x123456789ABCDEF0
TEST 2
hello world
address = 0xAB
type(cat) = <class '__main__.myclass'>
cat val = 0x0000000000000055
TEST 3
hello world
address = 0xAB
type(bird) = <class '__main__.myclass'>
Traceback (most recent call last):
  File "C:\(big path)\bignum5.py", line 69, in <module>
    print 'bird val = 0x%016X' % bird
TypeError: int argument required



More information about the Python-list mailing list