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