Not Defined error in basic code

Jack Dangler tdldev at gmail.com
Thu Mar 14 12:43:40 EDT 2019


On 3/14/19 10:39 AM, Calvin Spealman wrote:
> A few notes, Jack:
>
> On Thu, Mar 14, 2019 at 10:32 AM Jack Dangler <tdldev at gmail.com 
> <mailto:tdldev at gmail.com>> wrote:
>
>
>     On 3/14/19 10:11 AM, Calvin Spealman wrote:
>>     Where are you seeing something like this? The two lines under
>>     `class weapon:` are not correct because they are variable names
>>     that you've never defined.
>>
>>     Maybe you intended this to "declare" the attributes for the
>>     class? That isn't something you need to do in Python. If you
>>     simply remove these lines your example should work.
>>
>>     On Thu, Mar 14, 2019 at 10:05 AM Jack Dangler <tdldev at gmail.com
>>     <mailto:tdldev at gmail.com>> wrote:
>>
>>         Just getting started with tutorials and such, and don't
>>         understand this -
>>
>>         <file: class_weapon.py>
>>
>>         class weapon:
>>              weaponId
>>              manufacturerName
>>
>>              def printWeaponInfo(self):
>>                  infoString = "ID: %d Mfg: %s Model: %s" %
>>         (self.weaponId,
>>         self.manufacturerName)
>>                  return infoString
>>
>>         <file: weaponTrack.py>
>>
>>         import class_weapon
>>
>>         MyWeapon=weapon()
>>         MyWeapon.weaponId = 100
>>         MyWeapon.manufacturerName = "Glock"
>>
>>         print(MyWeapon.printWeaponInfo)
>>
>>         executing 'python3 weaponTrack.py' results in this bailing on
>>         the first
>>         element in the class with "not defined". I've been staring at
>>         templates
>>         of this exact structure for about an hour trying to figure
>>         out why this
>>         isn't running at all. Is it simply because it isn't all in
>>         one file?
>>         Thanks for any guidance. Really appreciate the help.
>>
>>
>>         Thanks.
>>
>>         -- 
>>         https://mail.python.org/mailman/listinfo/python-list
>>
>>
>>
>>     -- 
>>
>>     CALVIN SPEALMAN
>>
>>     SENIOR QUALITY ENGINEER
>>
>>     cspealma at redhat.com <mailto:cspealma at redhat.com> M:
>>     +1.336.210.5107 <tel:+1.336.210.5107>
>>
>>     <https://red.ht/sig>
>>     TRIED. TESTED. TRUSTED. <https://redhat.com/trusted>
>
>     Calvin
>
>     Thank you for the reply. I tried defining them in the form of 'int
>     weaponId' but that didn't help. I finally put it in this form
>     'weaponId=0" and it liked that. So, i updated the class file to be
>     as follows -
>
>     <file: class_weapon.py>
>
>     class weapon:
>          weaponId=0
>          manufacturerName=""
>
> Technically this will work, but it won't always work. You're assigning 
> these values directly to the class (or type) and not to individual 
> objects of that type.
>
> This will break very badly if you try to do this with any type of 
> value that can be changed (like a list, which you can add things to) 
> because you'll accidentally
> modify values shared between ALL objects of the same type. Instead, 
> you want to define a __init__ method, which is called when all objects 
> of this type are
> created, and assign the attributes in there. Like this:
>
> def __init__(self):
>     self.weaponId = 0
>     self.manufacturerName = ""
>
> Of course, you could make it easier to create the specific objects you 
> want by passing parameters at the creation of the object:
>
> def __init__(self, weaponId, manufacturerName):
>     self.weaponId = weaponId
>     self.manufacturerName = manufacturerName
>
>          def printWeaponInfo(self):
>              infoString = "ID: %d Mfg: %s " % (self.weaponId,
>     self.manufacturerName)
>              return infoString
>
>     The second file now looks like this -
>
>     <file: weaponTrack.py>
>
>     import class_weapon
>     MyWeapon=class_weapon.weapon
>     MyWeapon.weaponId = 100
>     MyWeapon.manufacturerName = "Glock"
>
> If you follow my advice above, you won't need to override the values here.
>
> But you aren't actually creating anything here, because this line:
>
> MyWeapon = class_weapon.weapon
> Doesn't create anything. It just assigns the class you made to a new 
> name. What you probably meant to do, and can do with the
> __init__ I suggest above, is create an instance of your weapon class 
> like this:
>
> MyWeapon = class_weapon.weapon(100, "Glock")
>
>
>     print(MyWeapon.printWeaponInfo)
>
> Similarly, you probably meant to call this method but without 
> parenthesis on the method you just printed the object representing
> the method itself, rather than calling it and printing the value it 
> returns.
>
> print(MyWeapon.printWeaponInfo())
>
>     so now, when I run 'python3 weaponTrack.py', I get <function
>     weapon.printWeaponInfo at 0x7f2bd3ae7510>, but am expecting
>
>     ID: 100 Mfg: Glock ...
>
> I hope this helps.
>
> -- 
>
> CALVIN SPEALMAN
>
> SENIOR QUALITY ENGINEER
>
> cspealma at redhat.com <mailto:cspealma at redhat.com> M: +1.336.210.5107 
> <tel:+1.336.210.5107>
>
> <https://red.ht/sig>
> TRIED. TESTED. TRUSTED. <https://redhat.com/trusted>


Calvin

Really great explanation! Giving me a lot to go on. I changed the files 
as suggested (I think), and now have this -

The first file now looks like this -

<file: class_weapon.py>

class weapon:
     weaponId
     manufacturerName

     # Creation/Instantiation
     def __init__(self, weaponId, manufacturerName):
         self.weaponId = weaponId
         self.manufacturerName = manufacturerName

     # Print the class data
     def printWeaponInfo(self):
         infoString = "ID: %d Mfg: %s ." % (self.weaponId, 
self.manufacturerName)
         return infoString

The second file now looks like this -

<file: weaponTrack.py>

import class_weapon

MyWeapon = class_weapon.weapon(100, "Glock")
#MyWeapon.weaponId = 100
#MyWeapon.manufacturerName = "Glock"

print(MyWeapon.printWeaponInfo())

Results:

python3 ./weaponTest.py
Traceback (most recent call last):
   File "./weaponTest.py", line 1, in <module>
     import class_weapon
   File "/home/jack/Py/weaponTrack/class_weapon.py", line 1, in <module>
     class weapon:
   File "/home/jack/MyScripts/Py/weaponTrack/class_weapon.py", line 2, 
in weapon
     weaponId
NameError: name 'weaponId' is not defined





More information about the Python-list mailing list