Perché i metodi sono considerati gli attributi di classe in Python?

3

Ho letto in un libro che entrambi i metodi e campi sono considerati gli attributi di una classe in Python. Tuttavia, recentemente mi è stato detto da un mio amico che i metodi potrebbero non essere considerati gli attributi di una classe.

Poi ho deciso di verificarlo di nuovo, e ho trovato questa domanda menzionata su Wikipedia che diceva che questa è una "tradizione" Python per riferirsi ai metodi come attributi, in contrasto con altri linguaggi di programmazione orientati agli oggetti.

Quindi la mia domanda è: perché i metodi considerati gli attributi di classe insieme ai campi in Python in contrasto con altri linguaggi?

Grazie!

    
posta v_2e 01.08.2013 - 22:40
fonte

1 risposta

9

Il tuo amico ha torto. I metodi sono attributi.

Tutto in Python è oggetti, in realtà, con metodi e funzioni e qualsiasi cosa con un metodo __call__() come oggetti callable . Sono tutti oggetti che rispondono alla sintassi delle espressioni di chiamata () .

Quindi gli attributi sono oggetti trovati dalla ricerca di attributi su altri oggetti. Non importa al meccanismo di ricerca degli attributi che ciò che viene cercato è un oggetto chiamabile o meno.

Puoi osservare questo comportamento cercando il solo e non chiamandolo:

>>> class Foo(object):
...     def bar(self):
...         pass
... 
>>> f = Foo()
>>> f.bar
<bound method Foo.bar of <__main__.Foo object at 0x1023f5590>>

Qui f.bar è un'espressione di ricerca di attributi, il risultato è un oggetto metodo.

Certo, anche il tuo amico mi sta un po 'bene; ciò che sta realmente accadendo è che i metodi sono oggetti speciali che racchiudono funzioni , mantenendo i riferimenti all'istanza sottostante e alla funzione originale, e vengono creati al volo accedendo alla funzione come attributo. Ma questo potrebbe complicare un po 'le cose quando inizi a cercare di capire gli oggetti Python. Se sei interessato a come funziona, leggi il Python Descrittore HOWTO per vedere come attributi con metodi speciali sono trattati in modo diverso su determinati tipi di accesso agli attributi.

Tutto funziona perché Python è un linguaggio dinamico; non sono richieste dichiarazioni di tipo. Per quanto riguarda la lingua, non importa se Foo.bar è una stringa, un dizionario, un generatore o un metodo. Ciò è in contrasto con i linguaggi compilati, in cui i dati sono molto diversi dai metodi e ogni campo di un'istanza deve essere preventivamente annidato a un tipo specifico. I metodi generalmente sono oggetti non , quindi un concetto separato dai dati.

    
risposta data 01.08.2013 - 22:42
fonte

Leggi altre domande sui tag