Nuovo in Python e dopo aver letto un po ', sto facendo alcuni metodi nei miei metodi di classe classe personalizzati piuttosto che metodi di istanza.Python - perché posso chiamare un metodo di classe con un'istanza?
Così ho provato il mio codice, ma non aveva cambiato un po 'del metodo chiamate per chiamare il metodo della classe piuttosto che l'istanza, ma ancora lavorato:
class myclass:
@classmethod:
def foo(cls):
print 'Class method foo called with %s.'%(cls)
def bar(self):
print 'Instance method bar called with %s.'%(self)
myclass.foo()
thing = myClass()
thing.foo()
thing.bar()
Questo produce:
class method foo called with __main__.myclass.
class method foo called with __main__.myclass.
instance method bar called with <__main__.myclass instance at 0x389ba4>.
Quindi quello che mi chiedo è perché posso chiamare un metodo di classe (foo) su un'istanza (thing.foo), (anche se è la classe che viene passata al metodo)? Ha senso, dato che 'cosa' è un 'myClass', ma mi aspettavo che Python desse un errore dicendo qualcosa sulla falsariga di 'foo è un metodo di classe e non può essere chiamato su un'istanza'.
Questa è solo una conseguenza prevista dell'ereditarietà con l'oggetto "cosa" che eredita il metodo foo dalla sua superclasse?
Se provo a chiamare il metodo di istanza tramite la classe:
myclass.bar()
tanto sono:
TypeError: unbound method bar() must be called with myclass instance...
che ha perfettamente senso.
In Python, i metodi non vengono chiamati * su * qualcosa. 'thing.foo' non è una chiamata al metodo, è un accesso agli attributi, è fondamentalmente la stessa cosa di' getattr (cosa, "pippo") '. – Alexey
@Alexey Sicuramente 'foo' è un metodo e 'thing.foo()' sta chiamando il metodo 'foo' dell'oggetto' cosa'? Non è un attributo la terminologia di Python per ciò che altri linguaggi si riferiscono a una variabile o proprietà? –
Penso che "' (thing.foo)() 'sta chiamando il metodo' foo' dell'oggetto 'cosa'" (parentesi per chiarezza) è una metafora per "' (thing.foo)() 'sta chiamando il oggetto chiamabile 'thing.foo'", è così. AFAIU, questo oggetto viene creato dinamicamente quando viene chiamato 'getattr (thing," foo ")' e ovviamente ha un riferimento all'oggetto 'thing'. – Alexey