Создание метода, частного в подклассе Python

Ничто из этого больше не используется моим другом, мой совет состоит в том, чтобы отделить представление (css, html, javascript и т. д.) от сервера.

В моем случае я делаю свои системы, обрабатывающие представление с помощью Угловые и любые необходимые данные приводятся с сервера с использованием служб отдыха.

Поверьте, это изменит способ проектирования

25
задан Geo 16 January 2009 в 21:15
поделиться

8 ответов

Python распределяется как источник. Самая идея закрытого метода имеет очень мало смысла.

программист, который хочет расшириться B, разбитый проблемой конфиденциальности, смотрит на источник для B, копирует и вставляет исходный код для method в подкласс C.

, Что Вы получили через "конфиденциальность"? Лучшее, на которое можно надеяться, должно расстроить потенциальных клиентов в копирование и вставку.

В худшем случае, они отбрасывают Ваш пакет, потому что они не могут расширить его.

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

Видят , Как я защищаю код Python?

<час>

Редактирование На "защищенном от дурака" коде.

Первый, Python распределяется как источник 90% времени. Так, любой идиот, который загружает, устанавливает, и затем отказывается читать руководство API и звонит, методы не в порядке все еще имеет источник для выяснения то, что пошло не так, как надо.

у Нас есть три класса идиотов.

  • Люди, которые отказываются читать руководство API (или просматривать его и игнорировать соответствующие части) и называть методы не в порядке несмотря на документацию. Можно попытаться сделать что-то частным, но это не поможет, потому что они будут делать что-то еще неправильно - и жаловаться на это. [Я не назову имена, но я работал с людьми, которые, кажется, проводят много времени, называя API неправильно. Кроме того, Вы будете видеть вопросы как это на ТАК.]

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

  • Люди, которые смущены API и называют методы каждым различным путем, можно вообразить (и некоторые, которые Вы не можете.) Можно попытаться сделать что-то частным, но они никогда не будут получать API.

    можно только помочь им путем обеспечения рабочего примера кода; даже тогда они вырежут и вставят его неправильно.

  • Люди, которые отклоняют Ваш API и хотят переписать его для создания его "защищенным от неправильного использования".

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

    можно вовлечь этих людей в возрастающую гонку вооружений "защищения от неквалифицированного вмешательства". Все, что Вы соединяете, они демонтируют.

На данном этапе, что конфиденциальность сделала для Вас? Некоторые люди откажутся понимать его; некоторые люди смущены им; и некоторые люди хотят работать вокруг этого.

Как насчет общественности, и позволяют людям, которых Вы звоните, "идиоты" извлекают уроки из Вашего кода?

11
ответ дан Community 15 October 2019 в 14:46
поделиться

Нет никакого способа действительно сделать это в Python. Скорее unpythonic, это.

, Поскольку Guido сказал бы, мы все соглашаемся взрослые здесь.

Вот польза сводка философии позади всего в Python быть общедоступным .

28
ответ дан Triptych 15 October 2019 в 14:46
поделиться

Я удивлен, что никто не упомянул это, но добавление префикса имени метода с одинарным подчеркиванием является корректным способом маркировать его как "частный". Это не действительно частное , конечно, (как объяснено в других ответах), но там Вы идете.

def _i_am_private(self):
    """If you call me from a subclass you are a naughty person!"""
11
ответ дан Ali Afshar 15 October 2019 в 14:46
поделиться

Можно снабдить префиксом методы и участников с одинарным или двойным подчеркиванием. Одинарное подчеркивание подразумевает, "не используйте меня, я, как предполагается, используюсь только этим классом", и двойное подчеркивание дает компилятору Python команду искажать метод/имя элемента с именем класса; пока класс и его подклассы не имеют того же имени, методы/участников можно считать "частными".

Однако решение Ваших требований до сих пор состоит в том, чтобы записать четкую документацию. Если Вы не хотите, чтобы Ваши пользователи назвали методы в неправильном порядке, то говорите так в документации.

, В конце концов, даже рядовые C++ не то, что частные. Например, думайте старый прием:

#define private public
#include <module>
12
ответ дан tzot 15 October 2019 в 14:46
поделиться

"Все должно быть общедоступными" сторонниками, думают, что автор пытается скрыть полезный API от пользователей. Этот парень не хочет нарушать неоспоримый закон Python. Он хочет использовать некоторые методы для определения полезного API, и он хочет использовать другие методы для организации реализации того API. Если нет никакого разделения между двумя, это не означает, что автор не является идиотом. Это означает, что автор был слишком ленив для фактического определения API.

В Python, вместо того, чтобы отметить свойства или методы, столь же частные, они могут быть снабжены префиксом _ как слабый индикатор "внутреннего пользования", или __ как немного более сильный. В модуле имена могут быть снабжены префиксом _ таким же образом, и можно также поместить последовательность строк, которые составляют общедоступный API модулей в переменной, названной __all__.

А глупая непротиворечивость является эльфом небольших умов.

7
ответ дан joeforker 15 October 2019 в 14:46
поделиться

Это может быть справедливым приближением. Лексический обзор к "спасению":

#!/usr/bin/env python

class Foo(object):
    def __init__(self, name):
        self.name = name
        self.bar()

    def bar(self):
        def baz():
            print "I'm private"
            print self.name

        def quux():
            baz()

        self.quux = quux


if __name__ == "__main__":
    f = Foo("f")
    f.quux()

    g = Foo("g")
    g.quux()

    f.quux()

Печать:

I'm private
f
I'm private
g
I'm private
f
7
ответ дан joeforker 15 October 2019 в 14:46
поделиться

Изменение унаследованного метода от общественности к частному наследование повреждений . А именно, это повреждает - отношения.

Воображают класс Ресторана с открытым методом открытых дверей (т.е. это - время обеда, и мы хотим зеркально отразить знак парадной двери от закрытого для открытия). Теперь мы хотим класс Питания, который совместно использовал бы многие детали реализации Ресторана (они оба повара потребности, кухни, тарелки, поставщики еды, и возможно даже официанты), но не иметь обеденной зоны, парадных дверей или метода открытых дверей. Наследование из Ресторана является ошибкой! Могло бы казаться, что все, что необходимо сделать, изменить метод открытых дверей на частный, таким образом, никто не может использовать его, но тогда "любой объект Питания - Ресторан" является ложью, так как часть открытого интерфейса Ресторана является открытыми дверями. Лучше осуществить рефакторинг Ресторан путем добавления нового базового класса, и затем и Ресторан и Питание происходят из него.

Языки с понятием защищенного или частного наследования поддерживают эту идею наследования для реализации только, но Python не является одним из тех. (И при этом это не полезно на тех языках, кроме редко.) Обычно то, когда непубличное наследование разыскивается, включение (иначе "имеет - отношения"), является лучшим путем, можно даже сделать атрибут защищенным или частным.

написания Python, защищенные с единственным начальным символом подчеркивания и частные с двойными начальными символами подчеркивания, с модификацией "философии" взрослых соглашения, упомянули в ответе Триптиха. "Опасные" атрибуты и методы Вашего класса, например, которые могли бы вызвать потерю данных, должны быть непубличными (сделать ли их защищенными, или частный под влиянием других факторов), с открытыми методами, используемыми для обеспечения более простого, более безопасного интерфейса.

6
ответ дан 15 October 2019 в 14:46
поделиться

Для создания вида метода частных Вы можете искажение имени метод как так:

class Foo:
    def __blah():
        pass

class Bar(Foo):
    def callBlah():
        self.__blah() # will throw an exception

, Но подклассы может все еще найти Ваши методы через самоанализ, если они действительно хотят.

, Но Python (преднамеренным дизайном и выбором) не имеет никакого понятия членов парламента, не занимающих официального поста.

5
ответ дан Dana 15 October 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: