Sottolineatura singola all'inizio:
Python non ha metodi privati reali. Al contrario, un carattere di sottolineatura all'inizio di un metodo o di un nome di attributo significa che non dovresti accedere a questo metodo, perché non fa parte dell'API.
class BaseForm(StrAndUnicode):
def _get_errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
errors = property(_get_errors)
(Questo frammento di codice è stato preso dal codice sorgente di django: django / forme / forme.py). In questo codice,errors
è una proprietà pubblica, ma il metodo chiamato da questa proprietà, _get_errors, è "privato", quindi non dovresti accedervi.
Due trattini bassi all'inizio:
Questo provoca molta confusione. Non dovrebbe essere usato per creare un metodo privato. Dovrebbe essere usato per evitare che il tuo metodo venga sovrascritto da una sottoclasse o acceduto accidentalmente. Vediamo un esempio:
class A(object):
def __test(self):
print "I'm a test method in class A"
def test(self):
self.__test()
a = A()
a.test()
# a.__test() # This fails with an AttributeError
a._A__test() # Works! We can access the mangled name directly!
Produzione:
$ python test.py
I'm test method in class A
I'm test method in class A
Ora crea una sottoclasse B ed esegui la personalizzazione per il metodo __test
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
L'output sarà ....
$ python test.py
I'm test method in class A
Come abbiamo visto, A.test () non ha chiamato i metodi B .__ test (), come potremmo aspettarci. In realtà, questo è il comportamento corretto per __. I due metodi chiamati __test () vengono automaticamente rinominati (alterati) in _A__test () e _B__test (), quindi non sovrascrivono accidentalmente. Quando crei un metodo che inizia con __ significa che non vuoi che nessuno sia in grado di sovrascriverlo e intendi accedervi solo all'interno della sua stessa classe.
Due trattini bassi all'inizio e alla fine:
Quando vediamo un metodo simile __this__
, non chiamarlo. Questo è un metodo che Python dovrebbe chiamare, non tu. Diamo un'occhiata:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
C'è sempre un operatore o una funzione nativa che chiama questi metodi magici. A volte è solo un hook python che chiama in situazioni specifiche. Ad esempio, __init__()
viene chiamato quando l'oggetto viene creato dopo che __new__()
viene chiamato per creare l'istanza ...
Facciamo un esempio ...
class FalseCalculator(object):
def __init__(self, number):
self.number = number
def __add__(self, number):
return self.number - number
def __sub__(self, number):
return self.number + number
number = FalseCalculator(20)
print number + 10 # 10
print number - 20 # 40
Per maggiori dettagli, consultare la guida PEP-8 . Per altri metodi magici, vedi questo PDF .