Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2016 23:59:04

quix
Зарегистрирован: 2012-06-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

О ООП!


class A(Model):
    name = models.ForeigenKey(AnyClass)

то есть, создан класс (джанго-модель) A, который имеет экземпляр name класса ForeignKey - верно?
Но более интересует - что говорит наличие AnyClass внутри скобок (на уровне Django я понимаю)? просьба разжевать на уровне Python

Офлайн

#2 Апрель 28, 2016 03:01:41

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

О ООП!

На уровне питона метод __init__ у ForeignKey требует параметр to и ничего более.

Офлайн

#3 Апрель 28, 2016 05:34:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

О ООП!

quix
ООП в питоне - штука достаточно хитрая, в том плане, что питон во всю использует метапрограммирование. Это значит, что объявление класса и то, как он будет на самом деле устроен в рантайме, может существенно отличаться. Вы, насколько я понимаю, привели пример модели Джанги. Вот там всё очень не просто и много магии происходит за кулисами.

quix
что говорит наличие AnyClass внутри скобок
В питоне вообще всё есть объект, и класс (как это не странно) это тоже объект. Поэтому классы вполне могут быть аргументами функций, так же как вообще любые сущности.

def factory(cls, *args, **kw):
    return cls(*args, **kw)
class A:
    a = 4
class B:
    a = 5
obj1 = factory(A)
obj2 = factory(B)
print(obj1.a, obj2.a)



Офлайн

#4 Апрель 28, 2016 06:16:28

quix
Зарегистрирован: 2012-06-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

О ООП!


FishHook
В питоне вообще всё есть объект, и класс (как это не странно) это тоже объект.
Кроме питона ничего то и не изучал из языков, посему то знаю, что всё в питоне - объект.
Погодите, понятие “объект” отличается от объекта в др. языках?
Или потому в питоне всё (скорее всего ) объект, так как в питоне всё ООП! И есть самый суперкласс Object !?

Офлайн

#5 Апрель 28, 2016 08:03:39

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

О ООП!

object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.

Отредактировано ayb (Апрель 28, 2016 08:08:42)

Офлайн

#6 Апрель 28, 2016 08:26:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

О ООП!

quix
Погодите, понятие “объект” отличается от объекта в др. языках?
Понятие “объект” само по себе достаточно абстрактное, вот что нам пишет википедия
Объе́кт - некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов)
в разных языках программирования объекты могут быть реализованы сильно по-разному. Например, в актуальной версии JS нет как таковых классов, но это вполне себе ООП. То есть
Погодите, понятие “объект” отличается
понятие не отличается, а вот сама техника написания программ, разумеется, самобытна, иначе все ЯП были бы одинаковы.



Офлайн

#7 Апрель 29, 2016 05:31:19

quix
Зарегистрирован: 2012-06-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

О ООП!

ayb
object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.
Например, в документации к моделям джанги используют такое выражение
a = A()
когда я, написав какой-никакой блог, ни разу не использовал создание инстансов вне класса.
Верно ли я понимаю, что всё это благодаря применению метапрограммированнию DJANGистов?

Офлайн

#8 Апрель 29, 2016 05:43:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

О ООП!

quix
Вы запутались в терминологии. Забудьте про метапрограммирование, оно вам пока не надо и, вполне вероятно, не понадобится никогда. Просто примите к сведению, что в питоне класс, в отличие от скажем Си++, это не только тип переменной (то есть абстрактное понятие, которое существует только в исходном коде как инструкция для компилятора и не имеет смысла после компиляции), но и вполне самостоятельная переменная, которую можно использовать так же как любой другой объект.
Скажу больше, функции - это тоже объекты. И вообще всё - объекты.

def foo():
    return 1
foo.a = 34
print(foo.a)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version