Ho letto l'articolo sul modello di dati di Python sul suo sito web di riferimento , e sono stato confuso da questa parte:
When the attribute is a user-defined method object, a new method object is only created if the class from which it is being retrieved is the same as, or a derived class of, the class stored in the original method object; otherwise, the original method object is used as it is.
Essenzialmente, non posso davvero evocare due scenari in cui in uno il metodo è l'oggetto è lo stesso dell'oggetto del metodo originale e nell'altro viene creato un nuovo metodo. Ecco il più vicino possibile:
class TestClass:
def TestFunc():
pass
class TestClass2:
x_attr = TestClass().TestFunc
y_attr = TestClass.TestFunc
def __init__(self):
print "x's class is " + repr(TestClass2.x_attr.__class__)
print "y's class is " + repr(TestClass2.y_attr.__class__)
if __name__ == '__main__':
tc = TestClass()
tc2 = TestClass2()
print "tc.TestFunc: ".ljust(20) + str(id(tc.TestFunc)) # retrieved from TestClass
print "TestClass.TestFunc: ".ljust(20) + str(id(TestClass.TestFunc))# retrieved from TestClass
print "tc2.x_attr: ".ljust(20) + str(id(tc2.x_attr)) # retrieved from TestClass2
print "tc2.y_attr: ".ljust(20) + str(id(tc2.y_attr)) # retrieved from TestClass2
Tuttavia, l'output dei diversi test case non è come mi aspetterei leggendo il passaggio dal Reference:
x's class is <type 'instancemethod'>
y's class is <type 'instancemethod'>
tc.TestFunc: 140591510137584
TestClass.TestFunc: 140591510137584
tc2.x_attr: 140591509970288
tc2.y_attr: 140591510137424
In particolare, mi aspettavo che TestClass.TestFunc
e tc2.y_attr
(cioè TestClass2.y_attr
) fossero gli stessi in base a quanto citato dal riferimento.
Inoltre, mi aspettavo di vedere lo stesso risultato per < tc.TestFunc
, TestClass.TestFunc
> coppia di confronto e il < tc2.x_attr
, tc2.y_attr
> coppia di confronto (vale a dire ogni coppia uguale o uguale).
Potresti per favore chiarire perché questo è e cosa sta cercando di dire esattamente il Reference?
Grazie!
P.S. Utilizzo di Python 2.7.6 su Ubuntu 14.04.