2009-07-21 4 views
10

Python предоставляет private name mangling для методов и атрибутов класса.В чем преимущество частного имени в Python?

Есть ли конкретные случаи, когда эта функция требуется, или это просто перенос с Java и C++?

Просьба описать прецедент, в котором должно использоваться использование имени Python, если оно есть?

Кроме того, меня не интересует случай, когда автор просто пытается предотвратить случайный доступ к внешним атрибутам. Я считаю, что этот случай использования не согласован с моделью программирования Python.

ответ

0

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

+0

Я упомянул об этом в оригинальный вопрос. Вы говорите, что не согласны? – cmcginty

+0

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

23

Отчасти для предотвращения случайных ошибок доступ к атрибутам. Вот пример:

В коде, который является библиотекой:

class YourClass: 
    def __init__(self): 
     self.__thing = 1   # Your private member, not part of your API 

В моем коде, в котором я унаследовав от своего класса библиотеки:

class MyClass(YourClass): 
    def __init__(self): 
     # ... 
     self.__thing = "My thing" # My private member; the name is a coincidence 

Без частного имя коверкая , мое случайное повторное использование вашего имени нарушит вашу библиотеку.

+0

IMO, YourClass должен определить _thing, а не __thing. Это позволит MyClass получить к нему доступ. Во-вторых, я вижу преимущество использования «__thing» в MyClass, если есть опасения, что реализация YourClass изменится. Единственная проблема заключается в том, что если кто-то хочет подклассировать MyClass, вам становится труднее получить доступ к «MyClass .__ thing». Похоже, вы жертвуете повторным использованием в будущем, чтобы защитить от «воображаемой» проблемы. Нет? – cmcginty

+5

@Casey: Вы правы, что существуют переменные-члены, которые вы хотите видеть в подклассах, и те, которые вы называете одним подчеркиванием. Вы сделаете их «защищенными» на C++. Но есть и члены, которые вы * не хотите видеть в подклассах, потому что они являются частью частной реализации вашего класса (и, как вы говорите, они подвержены изменению реализации). Для них это название. Это не мнимая проблема; Я на самом деле делал именно то, о чем я говорю, с библиотекой, которая использовала единственный символ подчеркивания, а не двойной для частного участника. – RichieHindle

+0

@RichieHindle: Точно. За исключением того, что это ВНЕШНИЙ доступ. ;) Подкласс рассматривается здесь как внешний. –

16

От PEP 8:

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

(Выделено)