Inheritance error: class Foo has no attribute "bar"

Steven D'Aprano steve at REMOVETHIScyber.com.au
Sun Jul 9 09:51:56 EDT 2006


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