在Python中,对象可以有另一个对象作为属性吗?

6 投票
4 回答
6750 浏览
提问于 2025-04-15 23:06

在Python中,一个对象可以有另一个对象作为它的属性吗?比如说,一个叫car的类可以有一个叫tire的类作为它的属性吗?

4 个回答

2

你可以把类和实例都作为类和实例的属性,这四种组合都可以正常工作,而且可以随意组合。不过,要记住类和实例之间的区别——你提问的方式似乎有点混淆。无论如何,按照你的问题字面意思来理解:

一个叫做车(car)的类可以有一个叫做轮胎(tire)的类作为属性吗?

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

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

在车类的内部,如果你写 tire = tire 这样的赋值是行不通的(因为名字搞混了!),所以你需要给类属性起个不同的名字,不能和它的值的类同名。(这条规则不适用于实例属性,因为实例属性的写法,比如 self.tire,是带有前缀的名字,不会造成名字混淆——这只适用于类属性)。这是否正是导致你提出这个问题的原因呢?

2

是的。

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

你是指一个叫做 tire 的类,还是这个类的一个实例呢?这两者都可以,不过后者可能更有用。如果你想要一个 对象,这个对象是类 Mary 的,并且它要有一个类型为 Fred 的对象,那么你就需要使用 classinst 这种赋值方式:

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>

撰写回答