LINUX.ORG.RU

Python - приватный конструктор

 ,


0

2

В питоне __init__(self) вместо конструктора. А еще в питоне все consenting adults, и настоящей приватности нет, а вместо этого если ты хочешь показать, что какая-то вещь не предназначена для внешнего использования, ты называешь ее с 1 символом подчеркивания в названии. Но что если я хочу, чтобы конструктор класса не использовали, а использовали только написанные мною factory методы/функции? Как мне другим consenting adults обозначить, что __init__ - не для них?

несмотря на то что в Python — всё это объект...

...само по себе Пайтоновское ООП — не такое как в классическом C++ ..

другими словами — ответ на твоё вопрос: либо сделать Метакласс (что слишком муторно), либо просто в документации к библиотеке опиши "не используйте констрактор! а вместо этого вот эту фабрику"

ну а вообще — жалко тебе чтоли если кто будет вызывать конструктор (противореча публичной документации).

посто сведи к минимуму функции конструктора (пусть конструктор ни чего не делает!)... и создай ещё_один ``def _init(arg1, arg3, arg2, ...)`` который и будет выполнять роль приватного конструктора!

user_id_68054 ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

А как я тогда из своих factory методов/функций буду его создавать? Мне же все равно __init__ придется вызывать.

hlebushek ★★
() автор топика

В питоне __init__(self) вместо конструктора.

Кстати, не совсем так - есть еще __new__.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от user_id_68054

Ну да. Вроде не как в C++, но и не как в джаваскрипте. В джаваскрипте с его прототипным наследованием я мог бы легко создавать новые экземпляры класса, не вызывая никаких инитов, а тут вроде и похоже, но не совсем.

hlebushek ★★
() автор топика
Ответ на: комментарий от hlebushek

Вроде не как в C++, но и не как в джаваскрипте. В джаваскрипте с его прототипным наследованием я мог бы легко создавать новые экземпляры класса, не вызывая никаких инитов

кстати, да! ООП очень близко к JS .. (с небольшими концептуальными разницами типа «кто передаёт this?»)

также как в Javascript — можно создать без __init__ — Python - приватный конструктор (комментарий)

но использование __new__ это уже ближе к Метаклассам (я лично препочитаю игнорировать понятие Метакласс... но возможно тебе это понравится! :))

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)

Ты можешь вообще не экспортировать свои классы из модулей. А экспортировать только factory-функции.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Это нормально, если я экспортирую factory функции, не экспортирую класс, но при этом буду пользоваться всякими методами получившихся объектов?

И еще, у этого подхода есть минус такой, что в данном случае статические методы тоже не будут экспортироваться.

hlebushek ★★
() автор топика
Ответ на: комментарий от yoghurt

> само по себе Пайтоновское ООП — не такое как в классическом C++

:'(

почему вообще я должен думать что я пишу? я хочу просто генерировать новую энтропию! :)

user_id_68054 ★★★★★
()

называешь ее с 1 символом подчеркивания в названии

Просто называй с двумя символами.

Siado ★★★★★
()
Ответ на: комментарий от user_id_68054

почему вообще я должен думать что я пишу? я хочу просто генерировать новую энтропию! :)

PHP ждет тебя

shty ★★★★★
()
Ответ на: комментарий от Siado

Я где-то прочитал, что не стоит использовать name mangling как модификатор приватности, а стоит вместо этого использовать одиночное подчеркивание.

hlebushek ★★
() автор топика

В питоне __init__(self) вместо конструктора.

man __new__

Но что если я хочу, чтобы конструктор класса не использовали

Интересно, зачем? Тащем-то инициализатор вызывается автоматически.

Virtuos86 ★★★★★
()
Ответ на: комментарий от user_id_68054

либо просто в документации к библиотеке опиши «не используйте констрактор! а вместо этого вот эту фабрику»

Меня, кстати, всегда удивляли высказывания типа «этого [доков и конвенции] явно недостаточно, ведь ушлый 'индус' все равно может вызвать/изменить и т.д. и поэтому ооп в питоне почмокивает!»

Ибо «разработчик», явно клавший на документацию и коментарии в коде, так же упрямо будет класть на все остальное - тесты, требования типа «defensive programming» и т.д. Ну, не сможет вызвать этот злочастный конструктор сам - накосячит еще где-нибудь.

anonymous
()

Спрятать класс куда-нибудь в функцию.

def makepeace():
    class Peace:
        pass

    return Peace()

anonymous
()
Ответ на: комментарий от user_id_68054

несмотря на то что в Python — всё это объект...

Не надо п-ть, в пистоне куча примитивов. И нет возможности их сделать полноцеными объектами. Даже в JS насчет этого лучше, там ими хоть можно поьзоваться в объектном контексте, и расширять сверху.

anonymous
()
Ответ на: комментарий от user_id_68054

тоже имеет отношение к делу

Если и имеет, то только то, чтобы намекнуть пистонистам, что в пистоне нет ООП.

anonymous
()

Как в JS в питоне нельзя сделать?


;(function(){
 var private=1
 o={smthDo: function(clb){clb(private)}}
}())

o.smthDo(function(x){console.log(x)})
// ::: 1

anonymous
()
Ответ на: комментарий от user_id_68054

ООП очень близко к JS

Ни хрена оно не близко. Оно ближе к жабе к чем к JS.

с небольшими концептуальными разницами типа «кто передаёт this?»

Скажи проще, в пистоне нет динамического связывания. А это не «небольшими концептуальными разницами», это называется отсос.

anonymous
()
Ответ на: комментарий от anonymous

Чтобы сделать совсем приватным - нельзя. Все равно все эти штуки будут доступны во всяких там __closure.

hlebushek ★★
() автор топика
Ответ на: комментарий от hlebushek

Но ведь суть в том, чтобы люди пользовались положенным API, а не так, как им хочется. Лезть куда-то там во всякие замыкания, чтобы доставать из них черт пойми что, вряд ли кто-то будет, слишком много мороки.

anonymous
()
Ответ на: комментарий от shty

> почему вообще я должен думать что я пишу? я хочу просто генерировать новую энтропию! :)

PHP ждет тебя

им я тоже иногда обмазываюсь :-)

(но потом, правда, мою руки с мылом)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Хрен е знает на чем ты проверяешь, у меня в V8 работает. Замени private на private_ тогда, в чем проблема то? Или мову не знаешь? Вечно у тебя проблемы на пучтом месте.

anonymous
()
Ответ на: комментарий от anonymous

ды ходят тут всякие анонимы и показывают неработающий код :-) ..

надеюсь вы хоть web-сайты не делаете (а просто теоретизируете)

user_id_68054 ★★★★★
()

Не пиши к нему docstring. Или напиши, но укажи, чтобы не вызывали. Или в docstring для класса напиши «No public constructor, use such-and-such functions instead».

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от hlebushek

А мне нравится идея. Исходную задачу решит максимально питонично, а задачу «спрятать совсем-совсем-совсем» все равно не выполнить.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)

Павлины говоришь, ха...

pon4ik ★★★★★
()
Ответ на: комментарий от anonymous

в пистоне нет динамического связывания

Я не уверен что ты под этим имел в виду, но, думаю, оно там есть.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

Проще всего - не писать на Python.

рекомендуешь PHP?

emulek
()
Ответ на: комментарий от yoghurt

I invented the term object-oriented, and I can tell you that C++ wasn't what I had in mind

троллинг.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.