tags:

views:

92

answers:

4

In Python, can an object have another object as an attribute? For example, can a class called car have a class called tire as an attribute?

+2  A: 

Do you mean a class tire or an instance of class tire? It can have both although the latter is probably more useful. If you're looking for an object of class Mary to has-a object of type Fred you'd want the classinst variety of assignment:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
>>> class Fred(object): pass
... 
>>> class Mary(object):
...     def __init__(self):
...         self.classref = Fred
...         self.classinst = Fred()
... 
>>> x = Mary()
>>> dir(x)
[... 'classinst', 'classref']
>>> x.classref
<class '__main__.Fred'>
>>> x.classinst
<__main__.Fred object at 0xb76eed0c>
msw
A: 

Sure; classes, like any other value, can be either class or instance attributes:

class A(object):
    pass

class B(object):
    class_attr = A

    def __init__(self):
        self.instance_attr = A

With this code, you could use B.class_attr or B().instance_attr to access A.

John Millikin
A: 

Yes.

>>> class tire:
...     pass
...
>>> class car:
...     def __init__(self, tire):
...             self.tire = tire
...
>>> t = tire()
>>> t.brand = 'Goodyear'
>>> c = car(t)
>>> c.tire.brand
'Goodyear'
Gonsalu
A: 

You can have both instances and classes as attributes of both classes and instances -- all four combinations work just fine (and can be combined freely). However, do keep in mind the distinction between a class and an instance thereof -- the way you phrase your question suggests some confusion. Anyway, taking your question literally:

can a class called car have a class called tire as an attribute?

class tire(object):
    ...class body here...

class car(object):
    thetire = tire
    ...rest of class body here...

A tire = tire assignment in the body of car would not work (naming confusion!-) so you need to name the class attribute differently than the class that's its value. (This does not apply to instance attributes, since their syntax, e.g. self.tire, is that of qualified names, not barenames, so there's no naming confusion -- only to class attributes). Was that perchance the source of the problem that led you to ask this question?

Alex Martelli