@Станиславе, нищо подобно. id-тата не се губят току така.
След седмица-две ще има по-advanced лекция за мета обектния протокол на езика и тогава ще ви се обясни това.
Засега накратко: Казахме ви, че is
просто сравнява id
-тата на два обекта. Истината е, че той не е толкова наивен. Когато се създаде нова инстанция на даден клас, не се копират всичките му методи и атрибути на ново място, поради очевидни причини. Т.е. когато извикаш a.f()
се извиква въпросния метод A.f
и му се подава инстанцията на a
като първи аргумент. Същото се случва и с b.f()
. Извиква се едно и също парче код, върху различни обекти.
Ако погледнем в паметта (както прави id
) тези два метода са едно и също нещо. Но реално - не са, тъй като се извикват върху два различни обекта. Дължината на котка и куче няма как да са едно и също нещо (дори по стойност да съвпаднат), предвид факта, че ги изпълняваме върху два различни обекта. И is
прави разликата.
Ето ви обаче малко храна за размисъл. Ако това, което ви казах е вярно, някой може ли да ми обясни защо тези двете са с различен адрес в паметта?
>>> id(A.f)
<<< 139964990037744
>>> id(a.f)
<<< 139964990004616