Найти - Пользователи
Полная версия: О ООП!
Начало » Python для новичков » О ООП!
1
quix

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

то есть, создан класс (джанго-модель) A, который имеет экземпляр name класса ForeignKey - верно?
Но более интересует - что говорит наличие AnyClass внутри скобок (на уровне Django я понимаю)? просьба разжевать на уровне Python
ayb
На уровне питона метод __init__ у ForeignKey требует параметр to и ничего более.
FishHook
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)
quix

FishHook
В питоне вообще всё есть объект, и класс (как это не странно) это тоже объект.
Кроме питона ничего то и не изучал из языков, посему то знаю, что всё в питоне - объект.
Погодите, понятие “объект” отличается от объекта в др. языках?
Или потому в питоне всё (скорее всего ) объект, так как в питоне всё ООП! И есть самый суперкласс Object !?
ayb
object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.
FishHook
quix
Погодите, понятие “объект” отличается от объекта в др. языках?
Понятие “объект” само по себе достаточно абстрактное, вот что нам пишет википедия
Объе́кт - некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов)
в разных языках программирования объекты могут быть реализованы сильно по-разному. Например, в актуальной версии JS нет как таковых классов, но это вполне себе ООП. То есть
Погодите, понятие “объект” отличается
понятие не отличается, а вот сама техника написания программ, разумеется, самобытна, иначе все ЯП были бы одинаковы.
quix
ayb
object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.
Например, в документации к моделям джанги используют такое выражение
a = A()
когда я, написав какой-никакой блог, ни разу не использовал создание инстансов вне класса.
Верно ли я понимаю, что всё это благодаря применению метапрограммированнию DJANGистов?
FishHook
quix
Вы запутались в терминологии. Забудьте про метапрограммирование, оно вам пока не надо и, вполне вероятно, не понадобится никогда. Просто примите к сведению, что в питоне класс, в отличие от скажем Си++, это не только тип переменной (то есть абстрактное понятие, которое существует только в исходном коде как инструкция для компилятора и не имеет смысла после компиляции), но и вполне самостоятельная переменная, которую можно использовать так же как любой другой объект.
Скажу больше, функции - это тоже объекты. И вообще всё - объекты.
def foo():
    return 1
foo.a = 34
print(foo.a)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB