2015-01-15 2 views
0

Я изучаю python, и я начал читать о структуре Django. В примерах, вот что я нашел:Являются ли объекты имен классов в python?

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

Не важно, что делает код. Мой вопрос о функции ManyToManyField(Person, through='Membership'). Там мы передаем имя класса функции.

Почему это разрешено? Являются ли объекты класса NAMES в python?

+1

Нет, вы не передаете имя класса функции. Вы передаете * фактический класс * в экземпляр другого класса. –

+0

Если вам интересно, почему 'Person' передается как ссылка, а' Membership' передается как строка, это функция моделей Django, позволяющая ссылаться на класс 'Membership' с помощью строки до того, как класс определен , –

+0

Соответствующая документация: https://docs.djangoproject.com/en/1.7/ref/models/fields/#foreignkey –

ответ

3

Да classes - объекты в Python. Каждый объект в python наследует от базового объекта object и class также наследует от object.

>>> class People: 
...  pass 
... 
>>> type(People) 
<type 'classobj'> 
>>> 
>>> isinstance(People, object) 
True 

Это подобно тому, как:

>>> class Group(object): 
...  pass 
... 
>>> type(Group) 
<type 'type'> 
>>> isinstance(Group, object) 
True 

В Python 3 как class class_name: и class class_name(object): возвращает тот же тип:

In [1]: class Person: 
    ...:  pass 
    ...: 
In [2]: Person 
Out[2]: __main__.Person 
In [3]: class Group(object): 
    ...:  pass 
    ...: 
In [4]: Group 
Out[4]: __main__.Group 

Каждая вещь в Python является object

>>> my_list = [] 
>>> my_list 
[] 
>>> isinstance(my_list, object) 
True 
+0

Так что пользовательские типы (классы) не наследуются от 'object' по умолчанию? – khajvah

+0

@khajvah Да, определенные пользователем классы также являются «объектами» в Python. –

+0

@khajvah: см. Https://wiki.python.org/moin/NewClassVsClassicClass –

Смежные вопросы