Inheritance error: class Foo has no attribute "bar"

crystalattice at gmail.com crystalattice at gmail.com
Wed Jul 12 19:11:23 EDT 2006


I checked my code today and your suggestion did fix the problem.  I
used your second idea of having the default class attributes with
individual instance attributes.  I ran into one problem where I kept
getting the error

" File "\\user1\jacksocl\Python_stuff\CMRPG\CharCreation.py", line 262,
in __init__
self.intel = Character.attrib_dict["intel"]
AttributeError: class Character has no attribute 'attrib_dict'
Script terminated."

but I figured out it was because I was calling the Character class
expressly in the Marine subclass when I wanted to rename a dictionary
value.  It was just a simple remedy of changing the called dictionary
from "Character.attrib_dict" to "self.attrib_dict".

It gets so confusing keeping track of all things OOP items, though it's
quite a bit worse learning it in C++.

Thanks for your help.
Steven D'Aprano wrote:
> On Sun, 09 Jul 2006 04:24:01 +0000, crystalattice wrote:
>
> > I've finally figured out the basics of OOP; I've created a basic character
> > creation class for my game and it works reasonably well. Now that I'm
> > trying to build a subclass that has methods to determine the rank of a
> > character but I keep getting errors.
> >
> > I want to "redefine" some attributes from the base class so I can use them
> > to help determine the rank. However, I get the error that my base class
> > doesn't have the dictionary that I want to use. I've tried several things
> > to correct it but they don't work (the base class is called "Character"
> > and the subclass is called "Marine"):
>
> Without seeing your class definitions, it is hard to tell what you are
> doing, but I'm going to take a guess: you're defining attributes in the
> instance instead of the class.
>
> E.g.
>
> class Character():
>     def __init__(self):
>         self.attrib_dict = {}
>
> attrib_dict is now an instance attribute. Every instance will have one,
> but the class doesn't.
>
> I'm thinking you probably want something like this:
>
> class Character():
>     attrib_dict = {}
>     def __init__(self):
>         pass
>
> Now attrib_dict is an attribute of the class. However, it also means that
> all instances will share the same values! Here's one possible solution to
> that:
>
> class Character():
>     default_attribs = {}
>     def __init__(self):
>         self.attribs = self.default_attribs.copy()
>
> Now there is one copy of default character attributes, shared by the class
> and all it's instances, plus each instance has it's own unique set of
> values which can be modified without affecting the defaults.
> 
> 
> Hope this clears things up for you.
> 
> 
> -- 
> Steven.




More information about the Python-list mailing list