Edit detail for ObjektyJazykaPython revision 1 of 1

1
Editor: geon
Time: 2006/03/15 21:46:31 GMT+0
Note:

changed:
-
    <h1>
      Objekty v Pythonu
    </h1>
    <p>
      Autor: Fredrik Lundh | http://effbot.org/zone/python-objects.htm | December 12, 2000
    </p>
    <p>
      Překlad: Pavel Kosina | http://www.geon.wz.cz | 21. červenec 2005<br>
      Korektura: Petr Přikryl | http://www.skil.cz/python | 05. srpen 2005
    </p>
    <h3>
      Úvod
    </h3>
    <p>
      Vyčistěte si hlavu.
    </p>
    <h3>
      Objekty
    </h3>
    <p>
      Všechny objekty v Pythonu mají:
    </p>
    <ul>
      <li>jedinečnou identitu (vrací ji funkce <i>id(x)</i>; číslo typu integer)
      </li>
      <li>typ (vrací jej funkce <i>type(x)</i> )
      </li>
      <li>nějaký obsah
      </li>
    </ul>
    <p>
      Identitu objektu nemůžete změnit.
    </p>
    <p>
      Typ objektu nemůžete změnit.
    </p>
    <p>
      Některé objekty umožňují změnit svůj <i>obsah</i> (tedy aniž by se 
      měnila identita nebo typ).
    </p>
    <p>
      Některé objekty neumožňují měnit svůj obsah (více níže).
    </p>
    <p>
      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.).
    </p>
    <h3>
      Více o objektech
    </h3>
    <p>
      Objekty mohou také mít:
    </p>
    <ul>
      <li>žádné nebo nějaké metody (poskytované objektem type)
      </li>
      <li>žádná nebo nějaká jména
      </li>
    </ul>
    <p>
      Některé objekty mají metody, které umožňují měnit obsah objektu (to 
      znamená měnit ho na místě).
    </p>
    <p>
      Některé objekty mají pouze metody, které umožňují k obsahu přistupovat,
      ale nemohou ho měnit.
    </p>
    <p>
      Některé objekty nemají vůbec žádné metody.
    </p>
    <p>
      I v případech, kdy objekty mají definovány metody, nebudete nikdy moci 
      změnit typ nebo identitu.
    </p>
    <p>
      Věci jako přiřazení atributů a odkazy na vlastní položky (item references)
      jsou jen syntaktickou lahůdkou (více níže).
    </p>
    <h3>
      Jména
    </h3>
    <p>
      Se jmény je to trochu jinak. Ve skutečnosti nejsou vlastností objektu a
      objekt sám o sobě neví jak se jmenuje.
    </p>
    <p>
      Objekt může mít libovolné množství jmen nebo vůbec žádné jméno.
    </p>
    <p>
      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é <i>prostory jmen</i>).
    </p>
    <p>
      Jmenné prostory jsou kolekce dvojic (jméno, reference na objekt).
      Jsou implementovány pomocí slovníků.
    </p>
    <p>
      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>
    <h3>
      Přiřazování
    </h3>
    <p>
      Přiřazení mění jmenné prostory, ne objekty.
    </p>
    <p>
      Jinými slovy, zápis
    </p>
    <blockquote>
      <b>name = 10</b>
    </blockquote>
    <p>
      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.
    </p>
    <p>
      Pokud jméno již existuje, přiřazením se nahradí původní jméno:
    </p>
    <blockquote>
      <b>name = 10<br>
      name = 20</b>
    </blockquote>
    <p>
      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.
    </p>
    <p>
      Pro srovnání, když napíšete:
    </p>
    <blockquote>
      <b>name = []<br>
      name.append(1)</b>
    </blockquote>
    <p>
      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.
    </p>
    <p>
      Věci jako <i>name.attr</i> nebo <i>name[index]</i> jsou jen
      syntaktickou lahůdkou (syntactic sugar) zastupující volání metod.
      S první formou jsou spojeny odpovídající metody 
      <i>__setattr__</i>/<i>__getattr__</i>, s druhou formou metody
      <i>__setitem__</i> / <i>__getitem__</i> (v závislosti na tom, na
      které straně příkazu přiřazení se zápisy objevují).
    </p>
    <p>
      A to je všechno.
    </p>
    <p>
      <a href="copyright.htm">Copyright</a> 2000 by Fredrik Lundh
    </p>


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í:

  • jedinečnou identitu (vrací ji funkce id(x); číslo typu integer)
  • typ (vrací jej funkce type(x) )
  • nějaký obsah

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:

  • žádné nebo nějaké metody (poskytované objektem type)
  • žádná nebo nějaká jména

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