Not Defined error in basic code

Jack Dangler tdldev at gmail.com
Thu Mar 14 13:23:14 EDT 2019


On 3/14/19 12:50 PM, Calvin Spealman wrote:
> You still need to get of the two lines at the start of your class, 
> they are unnecessary and reference variables you never defined:
>
> class weapon:
>     weaponId  # Get rid of this line!
>     manufacturerName  # And this one, too!
>
> On Thu, Mar 14, 2019 at 12:43 PM Jack Dangler <tdldev at gmail.com 
> <mailto:tdldev at gmail.com>> wrote:
>
>
>     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
>
>
>
>
> -- 
>
> 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 very much for your patience! so the elements in the class are 
both declared and defined using the def __init__(self... construct. A 
little foreign to me, but I get it! And it does lend itself to being a 
more portable framework for working with classes. Thank you once again. 
Now I can keep reading and understand a whole lot more !

Thanks, again!




More information about the Python-list mailing list