Objekty v Pythonu

Autor: Fredrik Lundh | http://effbot.org/zone/python-objects.htm | December 12, 2000

Překlad: Pavel Kosina | http://www.geon.wz.cz | 21. červenec 2005
Korektura: Petr Přikryl | http://www.skil.cz/python | 05. srpen 2005

Úvod

Vyčistěte si hlavu.

Objekty

Všechny objekty v Pythonu mají:

Identitu objektu nemůžete změnit.

Typ objektu nemůžete změnit.

Některé objekty umožňují změnit svůj obsah (tedy aniž by se měnila identita nebo typ).

Některé objekty neumožňují měnit svůj obsah (více níže).

Typ objektu je reprezentován objektem třídy type, který ví více o objektech tohoto typu (kolik bytů v paměti obvykle zabírají, jaké mají metody, atd.).

Více o objektech

Objekty mohou také mít:

Některé objekty mají metody, které umožňují měnit obsah objektu (to znamená měnit ho na místě).

Některé objekty mají pouze metody, které umožňují k obsahu přistupovat, ale nemohou ho měnit.

Některé objekty nemají vůbec žádné metody.

I v případech, kdy objekty mají definovány metody, nebudete nikdy moci změnit typ nebo identitu.

Věci jako přiřazení atributů a odkazy na vlastní položky (item references) jsou jen syntaktickou lahůdkou (více níže).

Jména

Se jmény je to trochu jinak. Ve skutečnosti nejsou vlastností objektu a objekt sám o sobě neví jak se jmenuje.

Objekt může mít libovolné množství jmen nebo vůbec žádné jméno.

Jména žijí ve jmenných prostorech (jako je třeba jmenný prostor modulu, jmenný prostor instance, lokální jmenný prostor funkce; říkáme jim také prostory jmen).

Jmenné prostory jsou kolekce dvojic (jméno, reference na objekt). Jsou implementovány pomocí slovníků.

Když voláte funkci nebo metodu, její jmenný prostor se inicializuje argumenty, které jste jí předali (jména se berou ze seznamu argumentů funkce, příslušné objekty jste dosadili při volání).

Přiřazování

Přiřazení mění jmenné prostory, ne objekty.

Jinými slovy, zápis

name = 10

znamená, že do vašeho lokálního prostoru jmen přidáváte jméno "name" a spojujete je s odkazem na objekt typu integer s hodnotou 10.

Pokud jméno již existuje, přiřazením se nahradí původní jméno:

name = 10
name = 20

Tento zápis znamená, že jste do lokálního prostoru jmen nejdříve přidali jméno "name" a zajistili jste, že odkazuje na objekt typu integer s hodnotou 10. Pak jste znovu vložili stejné jméno a spojili je s odkazem na objekt typu integer s hodnotou 20. Původní objekt "10" není touto operací nijak dotčen. Je mu to jedno.

Pro srovnání, když napíšete:

name = []
name.append(1)

pak nejprve do lokálního prostoru jmen přidáváte jméno "name" a spojíte je s odkazem na prázdný objekt typu seznam. Tímto zásahem se prostor jmen změnil. Poté voláte metodu toho objektu -- chcete aby si objekt seznamu na svůj konec připojil objekt typu integer. Tím se sice mění obsah objektu typu seznam, ale prostor jmen zůstává beze změny. Zúčastněného objektu typu integer se to rovněž nijak nedotkne.

Věci jako name.attr nebo name[index]? jsou jen syntaktickou lahůdkou (syntactic sugar) zastupující volání metod. S první formou jsou spojeny odpovídající metody __setattr__/__getattr__, s druhou formou metody __setitem__ / __getitem__ (v závislosti na tom, na které straně příkazu přiřazení se zápisy objevují).

A to je všechno.

Copyright 2000 by Fredrik Lundh