В Python может ли объект иметь другой объект в качестве атрибута? - PullRequest
3 голосов
/ 25 мая 2010

В Python может ли объект иметь другой объект в качестве атрибута? Например, может ли класс с именем car иметь в качестве атрибута класс с именем tyre ?

Ответы [ 4 ]

2 голосов
/ 25 мая 2010

Вы имеете в виду класс tire или экземпляр класса tire? Это может иметь и то и другое, хотя последнее, вероятно, более полезно. Если вы ищете объект класса Mary до has-a объекта типа 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>
0 голосов
/ 25 мая 2010

Вы можете иметь как экземпляры, так и классы в качестве атрибутов как классов, так и экземпляров - все четыре комбинации работают очень хорошо (и могут комбинироваться свободно). Однако имейте в виду различие между class и instance - то, как вы формулируете свой вопрос, наводит на мысль о некоторой путанице. В любом случае, воспринимая ваш вопрос буквально:

может ли класс под названием автомобиль иметь класс называется шина как атрибут?

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

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

Назначение tire = tire в теле car не сработает (путаница с именами! -), поэтому вам нужно назвать атрибут класса иначе, чем класс, который является его значением. (Это не относится к атрибутам instance , поскольку их синтаксис, например, self.tire, соответствует синтаксису квалифицированных имен, а не голых имен, поэтому нет путаницы в именах - только к класс атрибуты). Был ли этот случай источником проблемы, которая заставила вас задать этот вопрос?

0 голосов
/ 25 мая 2010

Да.

>>> class tire:
...     pass
...
>>> class car:
...     def __init__(self, tire):
...             self.tire = tire
...
>>> t = tire()
>>> t.brand = 'Goodyear'
>>> c = car(t)
>>> c.tire.brand
'Goodyear'
0 голосов
/ 25 мая 2010

Конечно; классы, как и любое другое значение, могут быть атрибутами класса или экземпляра:

class A(object):
    pass

class B(object):
    class_attr = A

    def __init__(self):
        self.instance_attr = A

С этим кодом вы можете использовать B.class_attr или B().instance_attr для доступа к A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...