Форум сайта python.su
0
class A(Model): name = models.ForeigenKey(AnyClass)
Офлайн
24
На уровне питона метод __init__ у ForeignKey требует параметр to и ничего более.
Офлайн
568
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)
Офлайн
0
FishHookКроме питона ничего то и не изучал из языков, посему то знаю, что всё в питоне - объект.
В питоне вообще всё есть объект, и класс (как это не странно) это тоже объект.
Офлайн
24
object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.
Отредактировано ayb (Апрель 28, 2016 08:08:42)
Офлайн
568
quixПонятие “объект” само по себе достаточно абстрактное, вот что нам пишет википедия
Погодите, понятие “объект” отличается от объекта в др. языках?
Объе́кт - некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов)в разных языках программирования объекты могут быть реализованы сильно по-разному. Например, в актуальной версии JS нет как таковых классов, но это вполне себе ООП. То есть
Погодите, понятие “объект” отличаетсяпонятие не отличается, а вот сама техника написания программ, разумеется, самобытна, иначе все ЯП были бы одинаковы.
Офлайн
0
aybНапример, в документации к моделям джанги используют такое выражение
object это базовый класс для инстансов классов, а не для классов. У классов базовый класс type. Вообще, метапрограмирование такая штука, которую без надобности не стоит использовать.
a = A()
Офлайн
568
quix
Вы запутались в терминологии. Забудьте про метапрограммирование, оно вам пока не надо и, вполне вероятно, не понадобится никогда. Просто примите к сведению, что в питоне класс, в отличие от скажем Си++, это не только тип переменной (то есть абстрактное понятие, которое существует только в исходном коде как инструкция для компилятора и не имеет смысла после компиляции), но и вполне самостоятельная переменная, которую можно использовать так же как любой другой объект.
Скажу больше, функции - это тоже объекты. И вообще всё - объекты.
def foo(): return 1 foo.a = 34 print(foo.a)
Офлайн