2015-11-22 2 views
1

Я узнаю о специальных методах в Python. Я понимаю синтаксис двойного подчеркивания для специальных методов - в соответствии с приведенным ниже примером.специальные методы - Python

Однако, когда вы читаете чужой код, как узнать, в общем, что, например, двойное подчеркнутое определение getitem открывает функциональность индексации [] (например, гипотетическую функцию getitem()), и это, например, удвоенное подчеркнутое определение len открывает способность len()? Можно ли использовать, например, помочь функциям понять это?

import collections 

Card = collections.namedtuple('Card', ['rank', 'suit']) 

class FrenchDeck: 
    ranks = [str(n) for n in range(2, 11)] + list('JQKA') 
    suits = 'spades diamonds clubs hearts'.split() 

    def __init__(self): 
     self._cards = [Card(rank, suit) for suit in self.suits 
             for rank in self.ranks] 

    def __len__(self): 
     return len(self._cards) 

    def __getitem__(self, position): 
     return self._cards[position] 

deck=FrenchDeck() 
print(len(deck)) 
print(deck.__len__()) 

print(deck.__getitem__(4)) 
print(deck[4]) 
+1

https://docs.python.org/2/reference/datamodel.html#object.__getitem__ –

+0

Двойные подчеркивания не являются особым синтаксисом; они просто обычные имена. Они являются только специальными, потому что интерпретатор определен для использования указанных функций. Если вы определили свою собственную функцию, например, '__myfunction__', это не имело бы особого значения, чем если бы вы назвали ее« myfunction ». Единственное отличие состоит в том, что имена, начинающиеся и заканчивающиеся на '__', зарезервированы для интерпретатора; '__foo__' не имеет особого значения сейчас, но нет гарантии, что этого не произойдет в будущем. – chepner

ответ

0

Да, функция справки будет работать. Вы также можете посмотреть documentation of the base object и посмотреть все встроенные функции __. Например:

object.__len__(self) 

Вызывается реализовать встроенную функцию len(). Должно возвращать длину объекта, целое число >= 0. Кроме того, объект, который не , определяет метод __nonzero__() и метод __len__() возвращает ноль считается ложным в булевом контексте.

Смежные вопросы