Not Defined error in basic code
Calvin Spealman
cspealma at redhat.com
Thu Mar 14 12:50:41 EDT 2019
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> 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> 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> 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 M: +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 M: +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 M: +1.336.210.5107
<https://red.ht/sig>
TRIED. TESTED. TRUSTED. <https://redhat.com/trusted>
More information about the Python-list
mailing list