GitHub Viewer
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001 Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR Swen Bachmann , 2026.
#
# Translators:
# python-doc bot, 2025
#
msgid ""
msgstr ""
"Project-Id-Version: Python 3.14\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-05 16:53+0200\n"
"PO-Revision-Date: 2026-08-10 00:02+0000\n"
"Last-Translator: Swen Bachmann \n"
"Language-Team: German (https://app.transifex.com/python-doc/teams/5390/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../../tutorial/classes.rst:5
msgid "Classes"
msgstr "Klassen"
#: ../../tutorial/classes.rst:7
msgid ""
"Classes provide a means of bundling data and functionality together. "
"Creating a new class creates a new *type* of object, allowing new "
"*instances* of that type to be made. Each class instance can have "
"attributes attached to it for maintaining its state. Class instances can "
"also have methods (defined by its class) for modifying its state."
msgstr ""
"Klassen bieten die Möglichkeit, Daten und Funktionalitäten zusammenzufassen. "
"Das Erstellen einer neuen Klasse erzeugt einen neuen *Typ* von Objekt, was "
"es ermöglicht, neue *Instanzen* dieses Typs zu erstellen. Jede "
"Klasseninstanz kann über Attribute verfügen, um ihren Zustand zu verwalten. "
"Klasseninstanzen können auch über Methoden (definiert durch ihre Klasse) "
"verfügen, um ihren Zustand zu ändern."
#: ../../tutorial/classes.rst:13
msgid ""
"Compared with other programming languages, Python's class mechanism adds "
"classes with a minimum of new syntax and semantics. It is a mixture of the "
"class mechanisms found in C++ and Modula-3. Python classes provide all the "
"standard features of Object Oriented Programming: the class inheritance "
"mechanism allows multiple base classes, a derived class can override any "
"methods of its base class or classes, and a method can call the method of a "
"base class with the same name. Objects can contain arbitrary amounts and "
"kinds of data. As is true for modules, classes partake of the dynamic "
"nature of Python: they are created at runtime, and can be modified further "
"after creation."
msgstr ""
"Im Vergleich zu anderen Programmiersprachen fügt der Klassenmechanismus von "
"Python Klassen mit einem Minimum an neuer Syntax und Semantik hinzu. Er ist "
"eine Mischung aus den Klassenmechanismen von C++ und Modula-3. Python-"
"Klassen bieten alle Standardfunktionen der objektorientierten "
"Programmierung: Der Vererbungungsmechanismus erlaubt mehrere Basisklassen, "
"eine abgeleitete Klasse kann jede Methode ihrer Basisklasse(n) "
"überschreiben, und eine Methode kann die gleichnamige Methode einer "
"Basisklasse aufrufen. Objekte können beliebige Mengen und Arten von Daten "
"enthalten. Wie auch Module zeichnen sich Klassen durch die dynamische Natur "
"von Python aus: Sie werden zur Laufzeit erzeugt und können nach ihrer "
"Erstellung weiter verändert werden."
#: ../../tutorial/classes.rst:23
msgid ""
"In C++ terminology, normally class members (including the data members) are "
"*public* (except see below :ref:`tut-private`), and all member functions are "
"*virtual*. As in Modula-3, there are no shorthands for referencing the "
"object's members from its methods: the method function is declared with an "
"explicit first argument representing the object, which is provided "
"implicitly by the call. As in Smalltalk, classes themselves are objects. "
"This provides semantics for importing and renaming. Unlike C++ and "
"Modula-3, built-in types can be used as base classes for extension by the "
"user. Also, like in C++, most built-in operators with special syntax "
"(arithmetic operators, subscripting etc.) can be redefined for class "
"instances."
msgstr ""
"In der C++-Terminologie sind Klassenmitglieder (einschließlich der "
"Datenelemente) normalerweise *public* (Ausnahmen siehe unten :ref:`tut-"
"private`), und alle Elementfunktionen sind *virtual*. Wie in Modula-3 gibt "
"es keine Kurzschreibweisen für den Zugriff auf die Elemente eines Objekts "
"aus dessen Methoden: Die Methodenfunktion wird mit einem expliziten ersten "
"Argument deklariert, das das Objekt darstellt und beim Aufruf implizit "
"übergeben wird. Wie in Smalltalk sind Klassen selbst Objekte. Dies bietet "
"eine Semantik zum Importieren und Umbenennen. Anders als in C++ und Modula-3 "
"können integrierte Typen als Basisklassen für Erweiterungen durch den "
"Benutzer verwendet werden. Zudem können, wie in C++, die meisten "
"integrierten Operatoren mit spezieller Syntax (arithmetische Operatoren, "
"Indizierung usw.) für Klasseninstanzen neu definiert werden."
#: ../../tutorial/classes.rst:34
msgid ""
"(Lacking universally accepted terminology to talk about classes, I will make "
"occasional use of Smalltalk and C++ terms. I would use Modula-3 terms, "
"since its object-oriented semantics are closer to those of Python than C++, "
"but I expect that few readers have heard of it.)"
msgstr ""
"(Da eine allgemein akzeptierte Terminologie für Klassen fehlt, werde ich "
"gelegentlich Begriffe aus Smalltalk und C++ verwenden. Ich würde Begriffe "
"aus Modula-3 verwenden, da dessen objektorientierte Semantik der von Python "
"näher kommt als die von C++, aber ich nehme an, dass nur wenige Leser davon "
"gehört haben.)"
#: ../../tutorial/classes.rst:43
msgid "A Word About Names and Objects"
msgstr "Ein Wort zu Namen und Objekten"
#: ../../tutorial/classes.rst:45
msgid ""
"Objects have individuality, and multiple names (in multiple scopes) can be "
"bound to the same object. This is known as aliasing in other languages. "
"This is usually not appreciated on a first glance at Python, and can be "
"safely ignored when dealing with immutable basic types (numbers, strings, "
"tuples). However, aliasing has a possibly surprising effect on the "
"semantics of Python code involving mutable objects such as lists, "
"dictionaries, and most other types. This is usually used to the benefit of "
"the program, since aliases behave like pointers in some respects. For "
"example, passing an object is cheap since only a pointer is passed by the "
"implementation; and if a function modifies an object passed as an argument, "
"the caller will see the change --- this eliminates the need for two "
"different argument passing mechanisms as in Pascal."
msgstr ""
"Objekte besitzen eine eigene Identität, und mehrere Namen (in verschiedenen "
"Gültigkeitsbereichen) können an dasselbe Objekt gebunden sein. Dies ist in "
"anderen Sprachen als Aliasing bekannt. Auf den ersten Blick wird dies bei "
"Python meist nicht wahrgenommen und kann beim Umgang mit unveränderlichen "
"Datentypen (Zahlen, Zeichenketten, Tupel) getrost ignoriert werden. Aliasing "
"hat jedoch eine unter Umständen überraschende Wirkung auf die Semantik von "
"Python-Code, der veränderliche Objekte wie Listen, Dictionaries und die "
"meisten anderen Typen enthält. Dies wird gewöhnlich zum Vorteil des "
"Programms genutzt, da sich Aliase in mancher Hinsicht wie Zeiger verhalten. "
"Beispielsweise ist die Übergabe eines Objekts günstig, da von der "
"Implementierung nur ein Zeiger übergeben wird; und wenn eine Funktion ein "
"als Argument übergebenes Objekt verändert, sieht der Aufrufer diese Änderung "
"--- was zwei verschiedene Mechanismen zur Argumentübergabe wie in Pascal "
"überflüssig macht."
#: ../../tutorial/classes.rst:61
msgid "Python Scopes and Namespaces"
msgstr "Python-Gültigkeitsbereiche und Namensräume"
#: ../../tutorial/classes.rst:63
msgid ""
"Before introducing classes, I first have to tell you something about "
"Python's scope rules. Class definitions play some neat tricks with "
"namespaces, and you need to know how scopes and namespaces work to fully "
"understand what's going on. Incidentally, knowledge about this subject is "
"useful for any advanced Python programmer."
msgstr ""
"Bevor wir Klassen einführen, muss ich dir zuerst etwas über Pythons "
"Gültigkeitsbereiche (Scopes) erzählen. Klassendefinitionen wenden einige "
"Raffinessen bei Namensräumen an, und du musst wissen, wie "
"Gültigkeitsbereiche und Namensräume funktionieren, um vollständig zu "
"verstehen, was passiert. Nebenbei bemerkt ist das Wissen über dieses Thema "
"für jeden fortgeschrittenen Python-Programmierer nützlich."
#: ../../tutorial/classes.rst:69
msgid "Let's begin with some definitions."
msgstr "Beginnen wir mit einigen Definitionen."
#: ../../tutorial/classes.rst:71
msgid ""
"A *namespace* is a mapping from names to objects. Most namespaces are "
"currently implemented as Python dictionaries, but that's normally not "
"noticeable in any way (except for performance), and it may change in the "
"future. Examples of namespaces are: the set of built-in names (containing "
"functions such as :func:`abs`, and built-in exception names); the global "
"names in a module; and the local names in a function invocation. In a sense "
"the set of attributes of an object also form a namespace. The important "
"thing to know about namespaces is that there is absolutely no relation "
"between names in different namespaces; for instance, two different modules "
"may both define a function ``maximize`` without confusion --- users of the "
"modules must prefix it with the module name."
msgstr ""
"Ein *Namensraum* ist eine Zuordnung von Namen zu Objekten. Die meisten "
"Namensräume sind derzeit als Python-Dictionaries implementiert, was aber "
"normalerweise in keiner Weise auffällt (außer bei der Performance) und sich "
"in Zukunft ändern kann. Beispiele für Namensräume sind: die Menge der "
"integrierten Namen (die Funktionen wie :func:`abs` und integrierte Ausnahmen "
"enthält), die globalen Namen in einem Modul und die lokalen Namen bei einem "
"Funktionsaufruf. In gewissem Sinne bildet auch die Menge der Attribute eines "
"Objekts einen Namensraum. Das Wichtigste über Namensräume ist, dass es "
"absolut keine Beziehung zwischen Namen in verschiedenen Namensräumen gibt, "
"so können beispielsweise zwei verschiedene Module eine Funktion ``maximize`` "
"ohne Verwirrung definieren --- Benutzer der Module müssen ihr den Modulnamen "
"voranstellen."
#: ../../tutorial/classes.rst:82
msgid ""
"By the way, I use the word *attribute* for any name following a dot --- for "
"example, in the expression ``z.real``, ``real`` is an attribute of the "
"object ``z``. Strictly speaking, references to names in modules are "
"attribute references: in the expression ``modname.funcname``, ``modname`` is "
"a module object and ``funcname`` is an attribute of it. In this case there "
"happens to be a straightforward mapping between the module's attributes and "
"the global names defined in the module: they share the same namespace! [#]_"
msgstr ""
"Übrigens verwende ich das Wort *Attribut* für jeden Namen, der einem Punkt "
"folgt --- im Ausdruck ``z.real`` ist beispielsweise ``real`` ein Attribut "
"des Objekts ``z``. Strenge genommen sind Referenzen auf Namen in Modulen "
"Attributreferenzen: Im Ausdruck ``modname.funcname`` ist ``modname`` ein "
"Modulobjekt und ``funcname`` ein Attribut davon. In diesem Fall gibt es "
"zufällig eine direkte Zuordnung zwischen den Attributen des Moduls und den "
"im Modul definierten globalen Namen: Sie teilen sich denselben Namensraum! "
"[#]_"
#: ../../tutorial/classes.rst:90
msgid ""
"Attributes may be read-only or writable. In the latter case, assignment to "
"attributes is possible. Module attributes are writable: you can write "
"``modname.the_answer = 42``. Writable attributes may also be deleted with "
"the :keyword:`del` statement. For example, ``del modname.the_answer`` will "
"remove the attribute :attr:`!the_answer` from the object named by "
"``modname``."
msgstr ""
"Attribute können schreibgeschützt oder beschreibbar sein. Im letzteren Fall "
"ist eine Zuweisung an Attribute möglich. Modulattribute sind beschreibbar: "
"du kannst ``modname.the_answer = 42`` schreiben. Beschreibbare Attribute "
"\"können auch mit der Anweisung :keyword:`del` gelöscht werden. Zum Beispiel "
"entfernt ``del modname.the_answer`` das Attribut :attr:`!the_answer` aus dem "
"Objekt namens ``modname``."
#: ../../tutorial/classes.rst:96
msgid ""
"Namespaces are created at different moments and have different lifetimes. "
"The namespace containing the built-in names is created when the Python "
"interpreter starts up, and is never deleted. The global namespace for a "
"module is created when the module definition is read in; normally, module "
"namespaces also last until the interpreter quits. The statements executed "
"by the top-level invocation of the interpreter, either read from a script "
"file or interactively, are considered part of a module called :mod:"
"`__main__`, so they have their own global namespace. (The built-in names "
"actually also live in a module; this is called :mod:`builtins`.)"
msgstr ""
"Namensräume werden zu unterschiedlichen Zeitpunkten erstellt und haben "
"unterschiedliche Lebensdauern. Der Namensraum, der die integrierten Namen "
"enthält, wird beim Start des Python-Interpreters erstellt und niemals "
"gelöscht. Der globale Namensraum für ein Modul wird beim Einlesen der "
"Moduldefinition erstellt, normalerweise bleiben Modulnamensräume ebenfalls "
"bestehen, bis der Interpreter beendet wird. Die Anweisungen, die auf "
"oberster Ebene des Interpreters ausgeführt werden, sei es aus einer "
"Skriptdatei oder interaktiv, gelten als Teil eines Moduls namens :mod:"
"`__main__` und haben daher ihren eigenen globalen Namensraum. (Die "
"integrierten Namen befinden sich eigentlich ebenfalls in einem Modul; dieses "
"heißt :mod:`builtins`.)"
#: ../../tutorial/classes.rst:106
msgid ""
"The local namespace for a function is created when the function is called, "
"and deleted when the function returns or raises an exception that is not "
"handled within the function. (Actually, forgetting would be a better way to "
"describe what actually happens.) Of course, recursive invocations each have "
"their own local namespace."
msgstr ""
"Der lokale Namensraum für eine Funktion wird beim Aufruf der Funktion "
"erstellt und gelöscht, wenn die Funktion zurückkehrt oder eine Ausnahme "
"auslöst, die nicht innerhalb der Funktion behandelt wird. (Eigentlich wäre "
"Vergessen eine bessere Beschreibung für das, was tatsächlich passiert.) "
"Selbstverständlich haben rekursive Aufrufe jeweils ihren eigenen lokalen "
"Namensraum."
#: ../../tutorial/classes.rst:112
msgid ""
"A *scope* is a textual region of a Python program where a namespace is "
"directly accessible. \"Directly accessible\" here means that an unqualified "
"reference to a name attempts to find the name in the namespace."
msgstr ""
"Ein *Gültigkeitsbereich* (Scope) ist ein Quelltextbereich eines Python-"
"Programms, in dem ein Namensraum direkt zugänglich ist. \"Direkt "
"zugänglich\" bedeutet hier, dass eine unqualifizierte Referenz auf einen "
"Namen versucht, den Namen in diesem Namensraum zu finden."
#: ../../tutorial/classes.rst:116
msgid ""
"Although scopes are determined statically, they are used dynamically. At any "
"time during execution, there are 3 or 4 nested scopes whose namespaces are "
"directly accessible:"
msgstr ""
"Obwohl Gültigkeitsbereiche statisch bestimmt werden, werden sie dynamisch "
"verwendet. Zu jedem Zeitpunkt der Ausführung gibt es 3 oder 4 verschachtelte "
"Gültigkeitsbereiche, deren Namensräume direkt zugänglich sind:"
#: ../../tutorial/classes.rst:120
msgid "the innermost scope, which is searched first, contains the local names"
msgstr ""
"der innerste Gültigkeitsbereich, der zuerst durchsucht wird, enthält die "
"lokalen Namen"
#: ../../tutorial/classes.rst:121
msgid ""
"the scopes of any enclosing functions, which are searched starting with the "
"nearest enclosing scope, contain non-local, but also non-global names"
msgstr ""
"die Gültigkeitsbereiche etwaiger umgebender Funktionen, die ausgehend vom "
"nächstgelegenen umgebenden Bereich durchsucht werden, enthalten nicht-"
"lokale, aber auch nicht-globale Namen"
#: ../../tutorial/classes.rst:123
msgid "the next-to-last scope contains the current module's global names"
msgstr ""
"der vorletzte Gültigkeitsbereich enthält die globalen Namen des aktuellen "
"Moduls"
#: ../../tutorial/classes.rst:124
msgid ""
"the outermost scope (searched last) is the namespace containing built-in "
"names"
msgstr ""
"der äußerste Gültigkeitsbereich (der zuletzt durchsucht wird) ist der "
"Namensraum, der die integrierten Namen enthält"
#: ../../tutorial/classes.rst:126
msgid ""
"If a name is declared global, then all references and assignments go "
"directly to the next-to-last scope containing the module's global names. To "
"rebind variables found outside of the innermost scope, the :keyword:"
"`nonlocal` statement can be used; if not declared nonlocal, those variables "
"are read-only (an attempt to write to such a variable will simply create a "
"*new* local variable in the innermost scope, leaving the identically named "
"outer variable unchanged)."
msgstr ""
"Wird ein Name als global deklariert, gehen alle Referenzen und Zuweisungen "
"direkt an den vorletzten Gültigkeitsbereich, der die globalen Namen des "
"Moduls enthält. Um Variablen neuzuweisen, die sich außerhalb des innersten "
"Gültigkeitsbereichs befinden, kann die Anweisung :keyword:`nonlocal` "
"verwendet werden, sind sie nicht als nonlocal deklariert, sind diese "
"Variablen schreibgeschützt (ein Versuch, in eine solche Variable zu "
"schreiben, erzeugt lediglich eine *neue* lokale Variable im innersten "
"Gültigkeitsbereich und lässt die gleichnamige äußere Variable unverändert)."
#: ../../tutorial/classes.rst:133
msgid ""
"Usually, the local scope references the local names of the (textually) "
"current function. Outside functions, the local scope references the same "
"namespace as the global scope: the module's namespace. Class definitions "
"place yet another namespace in the local scope."
msgstr ""
"Normally verweist der lokale Gültigkeitsbereich auf die lokalen Namen der "
"(im Quelltext) aktuellen Funktion. Außerhalb von Funktionen verweist der "
"lokale Gültigkeitsbereich auf denselben Namensraum wie der globale "
"Gültigkeitsbereich: den Namensraum des Moduls. Klassendefinitionen "
"platzieren einen weiteren Namensraum im lokalen Gültigkeitsbereich."
#: ../../tutorial/classes.rst:138
msgid ""
"It is important to realize that scopes are determined textually: the global "
"scope of a function defined in a module is that module's namespace, no "
"matter from where or by what alias the function is called. On the other "
"hand, the actual search for names is done dynamically, at run time --- "
"however, the language definition is evolving towards static name resolution, "
"at \"compile\" time, so don't rely on dynamic name resolution! (In fact, "
"local variables are already determined statically.)"
msgstr ""
"Es ist wichtig zu verstehen, dass Gültigkeitsbereiche quelltextbezogen "
"bestimmt werden: Der globale Gültigkeitsbereich einer in einem Modul "
"definierten Funktion ist der Namensraum dieses Moduls, ganz gleich, von wo "
"oder unter welchem Alias die Funktion aufgerufen wird. Andererseits erfolgt "
"die tatsächliche Suche nach Namen dynamisch zur Laufzeit --- die "
"Sprachdefinition entwickelt sich jedoch in Richtung einer statischen "
"Namensauflösung zur \"Kompilierzeit\", verlasse dich also nicht auf die "
"dynamische Namensauflösung! (Tatsächlich werden lokale Variablen bereits "
"statisch bestimmt.)"
#: ../../tutorial/classes.rst:146
msgid ""
"A special quirk of Python is that -- if no :keyword:`global` or :keyword:"
"`nonlocal` statement is in effect -- assignments to names always go into the "
"innermost scope. Assignments do not copy data --- they just bind names to "
"objects. The same is true for deletions: the statement ``del x`` removes "
"the binding of ``x`` from the namespace referenced by the local scope. In "
"fact, all operations that introduce new names use the local scope: in "
"particular, :keyword:`import` statements and function definitions bind the "
"module or function name in the local scope."
msgstr ""
"Eine Besonderheit von Python ist, dass Zuweisungen an Namen – wenn keine :"
"keyword:`global`- oder :keyword:`nonlocal`-Anweisung gilt – immer in den "
"innersten Gültigkeitsbereich eingehen. Zuweisungen kopieren keine Daten --- "
"sie binden lediglich Namen an Objekte. Das Gleiche gilt für Löschungen: Die "
"Anweisung ``del x`` entfernt die Bindung von ``x`` aus dem Namensraum, auf "
"den der lokale Gültigkeitsbereich verweist. Tatsächlich nutzen alle "
"Operationen, die neue Namen einführen, den lokalen Gültigkeitsbereich: "
"Insbesondere binden :keyword:`import`-Anweisungen und Funktionsdefinitionen "
"den Modul- oder Funktionsnamen im lokalen Gültigkeitsbereich."
#: ../../tutorial/classes.rst:154
msgid ""
"The :keyword:`global` statement can be used to indicate that particular "
"variables live in the global scope and should be rebound there; the :keyword:"
"`nonlocal` statement indicates that particular variables live in an "
"enclosing scope and should be rebound there."
msgstr ""
"Die Anweisung :keyword:`global` kann verwendet werden, um anzugeben, dass "
"bestimmte Variablen im globalen Gültigkeitsbereich liegen und dort neu "
"gebunden werden sollen, die Anweisung :keyword:`nonlocal` gibt an, dass "
"bestimmte Variablen in einem umgebenden Gültigkeitsbereich liegen und dort "
"neu gebunden werden sollen."
#: ../../tutorial/classes.rst:162
msgid "Scopes and Namespaces Example"
msgstr "Beispiel für Gültigkeitsbereiche und Namensräume"
#: ../../tutorial/classes.rst:164
msgid ""
"This is an example demonstrating how to reference the different scopes and "
"namespaces, and how :keyword:`global` and :keyword:`nonlocal` affect "
"variable binding::"
msgstr ""
"Dies ist ein Beispiel, das zeigt, wie auf die verschiedenen "
"Gültigkeitsbereiche und Namensräume zugegriffen wird und wie :keyword:"
"`global` und :keyword:`nonlocal` die Variablenbindung beeinflussen::"
#: ../../tutorial/classes.rst:168
msgid ""
"def scope_test():\n"
" def do_local():\n"
" spam = \"local spam\"\n"
"\n"
" def do_nonlocal():\n"
" nonlocal spam\n"
" spam = \"nonlocal spam\"\n"
"\n"
" def do_global():\n"
" global spam\n"
" spam = \"global spam\"\n"
"\n"
" spam = \"test spam\"\n"
" do_local()\n"
" print(\"After local assignment:\", spam)\n"
" do_nonlocal()\n"
" print(\"After nonlocal assignment:\", spam)\n"
" do_global()\n"
" print(\"After global assignment:\", spam)\n"
"\n"
"scope_test()\n"
"print(\"In global scope:\", spam)"
msgstr ""
"def scope_test():\n"
" def do_local():\n"
" spam = \"local spam\"\n"
"\n"
" def do_nonlocal():\n"
" nonlocal spam\n"
" spam = \"nonlocal spam\"\n"
"\n"
" def do_global():\n"
" global spam\n"
" spam = \"global spam\"\n"
"\n"
" spam = \"test spam\"\n"
" do_local()\n"
" print(\"After local assignment:\", spam)\n"
" do_nonlocal()\n"
" print(\"After nonlocal assignment:\", spam)\n"
" do_global()\n"
" print(\"After global assignment:\", spam)\n"
"\n"
"scope_test()\n"
"print(\"In global scope:\", spam)"
#: ../../tutorial/classes.rst:191
msgid "The output of the example code is:"
msgstr "Die Ausgabe des Beispielcodes lautet:"
#: ../../tutorial/classes.rst:193
msgid ""
"After local assignment: test spam\n"
"After nonlocal assignment: nonlocal spam\n"
"After global assignment: nonlocal spam\n"
"In global scope: global spam"
msgstr ""
"After local assignment: test spam\n"
"After nonlocal assignment: nonlocal spam\n"
"After global assignment: nonlocal spam\n"
"In global scope: global spam"
#: ../../tutorial/classes.rst:200
msgid ""
"Note how the *local* assignment (which is default) didn't change "
"*scope_test*\\'s binding of *spam*. The :keyword:`nonlocal` assignment "
"changed *scope_test*\\'s binding of *spam*, and the :keyword:`global` "
"assignment changed the module-level binding."
msgstr ""
"Beachte, wie die *lokale* Zuweisung (die der Standard ist) die Bindung von "
"*spam* in *scope_test* nicht verändert hat. Die :keyword:`nonlocal`-"
"Zuweisung hat die Bindung von *spam* in *scope_test* geändert und die :"
"keyword:`global`-Zuweisung hat die Bindung auf Modulebene geändert."
#: ../../tutorial/classes.rst:205
msgid ""
"You can also see that there was no previous binding for *spam* before the :"
"keyword:`global` assignment."
msgstr ""
"Du kannst auch sehen, dass vor der :keyword:`global`-Zuweisung keine "
"vorherige Bindung für *spam* existierte."
#: ../../tutorial/classes.rst:212
msgid "A First Look at Classes"
msgstr "Ein erster Blick auf Klassen"
#: ../../tutorial/classes.rst:214
msgid ""
"Classes introduce a little bit of new syntax, three new object types, and "
"some new semantics."
msgstr ""
"Klassen führen ein wenig neue Syntax, drei neue Objekttypen und einige neue "
"Semantiken ein."
#: ../../tutorial/classes.rst:221
msgid "Class Definition Syntax"
msgstr "Syntax von Klassendefinitionen"
#: ../../tutorial/classes.rst:223
msgid "The simplest form of class definition looks like this::"
msgstr "Die einfachste Form einer Klassendefinition sieht so aus::"
#: ../../tutorial/classes.rst:225
msgid ""
"class ClassName:\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
msgstr ""
"class ClassName:\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
#: ../../tutorial/classes.rst:232
msgid ""
"Class definitions, like function definitions (:keyword:`def` statements) "
"must be executed before they have any effect. (You could conceivably place "
"a class definition in a branch of an :keyword:`if` statement, or inside a "
"function.)"
msgstr ""
"Klassendefinitionen müssen, genau wie Funktionsdefinitionen (:keyword:`def`-"
"Anweisungen), ausgeführt werden, bevor sie eine Wirkung haben. (Man könnte "
"eine Klassendefinition denkbarer Weise in einem Zweig einer :keyword:`if`-"
"Anweisung oder innerhalb einer Funktion platzieren.)"
#: ../../tutorial/classes.rst:236
msgid ""
"In practice, the statements inside a class definition will usually be "
"function definitions, but other statements are allowed, and sometimes useful "
"--- we'll come back to this later. The function definitions inside a class "
"normally have a peculiar form of argument list, dictated by the calling "
"conventions for methods --- again, this is explained later."
msgstr ""
"In der Praxis sind die Anweisungen innerhalb einer Klassendefinition "
"üblicherweise Funktionsdefinitionen, aber andere Anweisungen sind zulässig "
"und manchmal nützlich --- darauf kommen wir später zurück. Die "
"Funktionsdefinitionen innerhalb einer Klasse haben normalerweise eine "
"besondere Form von Argumentliste, die durch die Aufrufkonventionen für "
"Methoden vorgegeben ist --- auch dies wird später erklärt."
#: ../../tutorial/classes.rst:242
msgid ""
"When a class definition is entered, a new namespace is created, and used as "
"the local scope --- thus, all assignments to local variables go into this "
"new namespace. In particular, function definitions bind the name of the new "
"function here."
msgstr ""
"Wird eine Klassendefinition betreten, wird ein neuer Namensraum erzeugt und "
"als lokaler Gültigkeitsbereich verwendet --- somit gehen alle Zuweisungen an "
"lokale Variablen in diesen neuen Namensraum. Insbesondere binden "
"Funktionsdefinitionen hier den Namen der neuen Funktion."
#: ../../tutorial/classes.rst:247
msgid ""
"When a class definition is left normally (via the end), a *class object* is "
"created. This is basically a wrapper around the contents of the namespace "
"created by the class definition; we'll learn more about class objects in the "
"next section. The original local scope (the one in effect just before the "
"class definition was entered) is reinstated, and the class object is bound "
"here to the class name given in the class definition header (:class:`!"
"ClassName` in the example)."
msgstr ""
"Wird eine Klassendefinition normal verlassen (durch das Ende), wird ein "
"*Klassenobjekt* erzeugt. Dies ist im Wesentlichen eine Hülle um den Inhalt "
"des durch die Klassendefinition erstellten Namensraums; wir werden im "
"nächsten Abschnitt mehr über Klassenobjekte lernen. Der ursprüngliche lokale "
"Gültigkeitsbereich (derjenige, der direkt vor dem Betreten der "
"Klassendefinition galt) wird wiederhergestellt und das Klassenobjekt wird "
"hier an den im Kopf der Klassendefinition angegebenen Klassennamen (:class:`!"
"ClassName` im Beispiel) gebunden."
#: ../../tutorial/classes.rst:259
msgid "Class Objects"
msgstr "Klassenobjekte"
#: ../../tutorial/classes.rst:261
msgid ""
"Class objects support two kinds of operations: attribute references and "
"instantiation."
msgstr ""
"Klassenobjekte unterstützen zwei Arten von Operationen: Attributreferenzen "
"und Instanziierung."
#: ../../tutorial/classes.rst:264
msgid ""
"*Attribute references* use the standard syntax used for all attribute "
"references in Python: ``obj.name``. Valid attribute names are all the names "
"that were in the class's namespace when the class object was created. So, "
"if the class definition looked like this::"
msgstr ""
"*Attributreferenzen* verwenden die Standardsyntax, die für alle "
"Attributreferenzen in Python genutzt wird: ``obj.name``. Gültige "
"Attributnamen sind alle Namen, die sich im Namensraum der Klasse befanden, "
"als das Klassenobjekt erzeugt wurde. Wenn die Klassendefinition also so "
"aussah::"
#: ../../tutorial/classes.rst:269
msgid ""
"class MyClass:\n"
" \"\"\"A simple example class\"\"\"\n"
" i = 12345\n"
"\n"
" def f(self):\n"
" return 'hello world'"
msgstr ""
"class MyClass:\n"
" \"\"\"A simple example class\"\"\"\n"
" i = 12345\n"
"\n"
" def f(self):\n"
" return 'hello world'"
#: ../../tutorial/classes.rst:276
msgid ""
"then ``MyClass.i`` and ``MyClass.f`` are valid attribute references, "
"returning an integer and a function object, respectively. Class attributes "
"can also be assigned to, so you can change the value of ``MyClass.i`` by "
"assignment. :attr:`~type.__doc__` is also a valid attribute, returning the "
"docstring belonging to the class: ``\"A simple example class\"``."
msgstr ""
"dann sind ``MyClass.i`` und ``MyClass.f`` gültige Attributreferenzen, die "
"jeweils eine Ganzzahl beziehungsweise ein Funktionsobjekt zurückgeben. "
"Klassenattribute können auch zugewiesen werden, sodass man den Wert von "
"``MyClass.i`` durch eine Zuweisung ändern kann. :attr:`~type.__doc__` ist "
"ebenfalls ein gültiges Attribut, das den zur Klasse gehörenden Docstring "
"zurückgibt: ``\"A simple example class\"``."
#: ../../tutorial/classes.rst:282
msgid ""
"Class *instantiation* uses function notation. Just pretend that the class "
"object is a parameterless function that returns a new instance of the class. "
"For example (assuming the above class)::"
msgstr ""
"Die *Instanziierung* einer Klasse verwendet Funktionsnotation. Stell dir "
"einfach vor, dass das Klassenobjekt eine parameterlose Funktion ist, die "
"eine neue Instanz der Klasse zurückgibt. Zum Beispiel (unter Annahme der "
"obigen Klasse)::"
#: ../../tutorial/classes.rst:286 ../../tutorial/classes.rst:303
msgid "x = MyClass()"
msgstr "x = MyClass()"
#: ../../tutorial/classes.rst:288
msgid ""
"creates a new *instance* of the class and assigns this object to the local "
"variable ``x``."
msgstr ""
"erzeugt eine neue *Instanz* der Klasse und weist dieses Objekt der lokalen "
"Variablen ``x`` zu."
#: ../../tutorial/classes.rst:291
msgid ""
"The instantiation operation (\"calling\" a class object) creates an empty "
"object. Many classes like to create objects with instances customized to a "
"specific initial state. Therefore a class may define a special method named :"
"meth:`~object.__init__`, like this::"
msgstr ""
"Die Instanziierungsoperation (das \\\"Aufrufen\\\" eines Klassenobjekts) "
"erzeugt ein leeres Objekt. Viele Klassen erzeugen Objekte bevorzugt mit "
"Instanzen, die auf einen bestimmten Anfangszustand angepasst sind. Daher "
"kann eine Klasse eine spezielle Methode namens :meth:`~object.__init__` "
"definieren, wie etwa so::"
#: ../../tutorial/classes.rst:296
msgid ""
"def __init__(self):\n"
" self.data = []"
msgstr ""
"def __init__(self):\n"
" self.data = []"
#: ../../tutorial/classes.rst:299
msgid ""
"When a class defines an :meth:`~object.__init__` method, class instantiation "
"automatically invokes :meth:`!__init__` for the newly created class "
"instance. So in this example, a new, initialized instance can be obtained "
"by::"
msgstr ""
"Wenn eine Klasse eine :meth:`~object.__init__`-Methode definiert, ruft die "
"Klasseninstanziierung automatisch :meth:`!__init__` für die neu erzeugte "
"Klasseninstanz auf. In diesem Beispiel kann eine neue, initialisierte "
"Instanz also wie folgt erzeugt werden::"
#: ../../tutorial/classes.rst:305
msgid ""
"Of course, the :meth:`~object.__init__` method may have arguments for "
"greater flexibility. In that case, arguments given to the class "
"instantiation operator are passed on to :meth:`!__init__`. For example, ::"
msgstr ""
"Natürlich kann die :meth:`~object.__init__`-Methode für mehr Flexibilität "
"auch Argumente besitzen. In diesem Fall werden dem "
"Klasseninstanziierungsoperator übergabene Argumente an :meth:`!__init__` "
"weitergeleitet. Zum Beispiel::"
#: ../../tutorial/classes.rst:309
msgid ""
">>> class Complex:\n"
"... def __init__(self, realpart, imagpart):\n"
"... self.r = realpart\n"
"... self.i = imagpart\n"
"...\n"
">>> x = Complex(3.0, -4.5)\n"
">>> x.r, x.i\n"
"(3.0, -4.5)"
msgstr ""
">>> class Complex:\n"
"... def __init__(self, realpart, imagpart):\n"
"... self.r = realpart\n"
"... self.i = imagpart\n"
"...\n"
">>> x = Complex(3.0, -4.5)\n"
">>> x.r, x.i\n"
"(3.0, -4.5)"
#: ../../tutorial/classes.rst:322
msgid "Instance Objects"
msgstr "Instanzobjekte"
#: ../../tutorial/classes.rst:324
msgid ""
"Now what can we do with instance objects? The only operations understood by "
"instance objects are attribute references. There are two kinds of valid "
"attribute names: data attributes and methods."
msgstr ""
"Was können wir nun mit Instanzobjekten tun? Die einzigen Operationen, die "
"von Instanzobjekten verstanden werden, sind Attributreferenzen. Es gibt zwei "
"Arten von gültigen Attributnamen: Datenattribute und Methoden."
#: ../../tutorial/classes.rst:328
msgid ""
"*Data attributes* correspond to \"instance variables\" in Smalltalk, and to "
"\"data members\" in C++. Data attributes need not be declared; like local "
"variables, they spring into existence when they are first assigned to. For "
"example, if ``x`` is the instance of :class:`!MyClass` created above, the "
"following piece of code will print the value ``16``, without leaving a "
"trace::"
msgstr ""
"*Datenattribute* entsprechen „Instanzvariablen“ in Smalltalk und "
"„Datenelementen“ in C++. Datenattribute müssen nicht deklariert werden; wie "
"lokale Variablen entstehen sie, wenn ihnen erstmals etwas zugewiesen wird. "
"Wenn ``x`` beispielsweise die oben erzeugte Instanz von :class:`!MyClass` "
"ist, gibt der folgende Codeabschnitt den Wert ``16`` aus, ohne Spuren zu "
"hinterlassen::\""
#: ../../tutorial/classes.rst:334
msgid ""
"x.counter = 1\n"
"while x.counter < 10:\n"
" x.counter = x.counter * 2\n"
"print(x.counter)\n"
"del x.counter"
msgstr ""
"x.counter = 1\n"
"while x.counter < 10:\n"
" x.counter = x.counter * 2\n"
"print(x.counter)\n"
"del x.counter"
#: ../../tutorial/classes.rst:340
msgid ""
"The other kind of instance attribute reference is a *method*. A method is a "
"function that \"belongs to\" an object."
msgstr ""
"Die andere Art von Instanzattributreferenz ist eine *Methode*. Eine Methode "
"ist eine Funktion, die zu einem Objekt „gehört“."
#: ../../tutorial/classes.rst:345
msgid ""
"Valid method names of an instance object depend on its class. By "
"definition, all attributes of a class that are function objects define "
"corresponding methods of its instances. So in our example, ``x.f`` is a "
"valid method reference, since ``MyClass.f`` is a function, but ``x.i`` is "
"not, since ``MyClass.i`` is not. But ``x.f`` is not the same thing as "
"``MyClass.f`` --- it is a *method object*, not a function object."
msgstr ""
"Gültige Methodennamen eines Instanzobjekts hängen von dessen Klasse ab. "
"Definitionsgemäß definieren alle Attribute einer Klasse, die "
"Funktionsobjekte sind, entsprechende Methoden ihrer Instanzen. In unserem "
"Beispiel ist ``x.f`` also eine gültige Methodenreferenz, da ``MyClass.f`` "
"eine Funktion ist, ``x.i`` hingege nicht, da ``MyClass.i`` keine ist. Aber "
"``x.f`` ist nicht dasselbe wie ``MyClass.f`` --- es ist ein "
"*Methodenobjekt*, kein Funktionsobjekt."
#: ../../tutorial/classes.rst:356
msgid "Method Objects"
msgstr "Methodenobjekte"
#: ../../tutorial/classes.rst:358
msgid "Usually, a method is called right after it is bound::"
msgstr ""
"Normalerweise wird eine Methode direkt aufgerufen, nachdem sie gebunden "
"wurde::"
#: ../../tutorial/classes.rst:360
msgid "x.f()"
msgstr "x.f()"
#: ../../tutorial/classes.rst:362
msgid ""
"If ``x = MyClass()``, as above, this will return the string ``'hello "
"world'``. However, it is not necessary to call a method right away: ``x.f`` "
"is a method object, and can be stored away and called at a later time. For "
"example::"
msgstr ""
"Wenn ``x = MyClass()`` gilt (wie oben), gibt dies die Zeichenkette ``'hello "
"world'`` zurück. Es ist jedoch nicht notwendig, eine Methode sofort "
"aufzurufen: ``x.f`` ist ein Methodenobjekt und kann gespeichert und zu einem "
"späteren Zeitpunkt aufgerufen werden. Zum Beispiel::"
#: ../../tutorial/classes.rst:366
msgid ""
"xf = x.f\n"
"while True:\n"
" print(xf())"
msgstr ""
"xf = x.f\n"
"while True:\n"
" print(xf())"
#: ../../tutorial/classes.rst:370
msgid "will continue to print ``hello world`` until the end of time."
msgstr "gibt bis ans Ende der Zeit weiterhin ``hello world`` aus."
#: ../../tutorial/classes.rst:372
msgid ""
"What exactly happens when a method is called? You may have noticed that ``x."
"f()`` was called without an argument above, even though the function "
"definition for :meth:`!f` specified an argument. What happened to the "
"argument? Surely Python raises an exception when a function that requires an "
"argument is called without any --- even if the argument isn't actually "
"used..."
msgstr ""
"Was genau passiert, wenn eine Methode aufgerufen wird? Du hast vielleicht "
"bemerkt, dass ``x.f()`` oben ohne Argument aufgerufen wurde, obwohl die "
"Funktionsdefinition für :meth:`!f` ein Argument angab. Was ist mit dem "
"Argument passiert? Python löst sicherlich eine Ausnahme aus, wenn eine "
"Funktion, die ein Argument erfordert, ohne ein solches aufgerufen wird --- "
"selbst wenn das Argument gar nicht verwendet wird..."
#: ../../tutorial/classes.rst:378
msgid ""
"Actually, you may have guessed the answer: the special thing about methods "
"is that the instance object is passed as the first argument of the "
"function. In our example, the call ``x.f()`` is exactly equivalent to "
"``MyClass.f(x)``. In general, calling a method with a list of *n* arguments "
"is equivalent to calling the corresponding function with an argument list "
"that is created by inserting the method's instance object before the first "
"argument."
msgstr ""
"Eigentlich hast du die Antwort vielleicht schon geahnt: Das Besondere an "
"Methoden ist, dass das Instanzobjekt als erstes Argument der Funktion "
"übergeben wird. In unserem Beispiel ist der Aufruf ``x.f()`` genau "
"äquivalent zu ``MyClass.f(x)``. Im Allgemeinen entspricht der Aufruf einer "
"Methode mit einer Liste von *n* Argumenten dem Aufruf der entsprechenden "
"Funktion mit einer Argumentliste, die durch Einfügen des Instanzobjekts der "
"Methode vor dem ersten Argument erstellt wird."
#: ../../tutorial/classes.rst:385
msgid ""
"In general, methods work as follows. When a non-data attribute of an "
"instance is referenced, the instance's class is searched. If the name "
"denotes a valid class attribute that is a function object, references to "
"both the instance object and the function object are packed into a method "
"object. When the method object is called with an argument list, a new "
"argument list is constructed from the instance object and the argument list, "
"and the function object is called with this new argument list."
msgstr ""
"Im Allgemeinen funktionieren Methoden wie folgt: Wenn auf ein Attribut einer "
"Instanz verwiesen wird, das kein Datenattribut ist, wird die Klasse der "
"Instanz durchsucht. Bezeichnet der Name ein gültiges Klassenattribut, das "
"ein Funktionsobjekt ist, werden Referenzen auf das Instanzobjekt und das "
"Funktionsobjekt in ein Methodenobjekt gepackt. Wird das Methodenobjekt mit "
"einer Argumentliste aufgerufen, wird aus dem Instanzobjekt und der "
"Argumentliste eine neue Argumentliste erstellt und das Funktionsobjekt mit "
"dieser neuen Argumentliste aufgerufen."
#: ../../tutorial/classes.rst:398
msgid "Class and Instance Variables"
msgstr "Klassen- und Instanzvariablen"
#: ../../tutorial/classes.rst:400
msgid ""
"Generally speaking, instance variables are for data unique to each instance "
"and class variables are for attributes and methods shared by all instances "
"of the class::"
msgstr ""
"Allgemein gesagt sind Instanzvariablen für Daten gedacht, die für jede "
"Instanz eindeutig sind, während Klassenvariablen für Attribute und Methoden "
"gedacht sind, die von allen Instanzen der Klasse geteilt werden::"
#: ../../tutorial/classes.rst:404
msgid ""
"class Dog:\n"
"\n"
" kind = 'canine' # class variable shared by all instances\n"
"\n"
" def __init__(self, name):\n"
" self.name = name # instance variable unique to each instance\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.kind # shared by all dogs\n"
"'canine'\n"
">>> e.kind # shared by all dogs\n"
"'canine'\n"
">>> d.name # unique to d\n"
"'Fido'\n"
">>> e.name # unique to e\n"
"'Buddy'"
msgstr ""
"class Dog:\n"
"\n"
" kind = 'canine' # class variable shared by all instances\n"
"\n"
" def __init__(self, name):\n"
" self.name = name # instance variable unique to each instance\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.kind # shared by all dogs\n"
"'canine'\n"
">>> e.kind # shared by all dogs\n"
"'canine'\n"
">>> d.name # unique to d\n"
"'Fido'\n"
">>> e.name # unique to e\n"
"'Buddy'"
#: ../../tutorial/classes.rst:422
msgid ""
"As discussed in :ref:`tut-object`, shared data can have possibly surprising "
"effects involving :term:`mutable` objects such as lists and dictionaries. "
"For example, the *tricks* list in the following code should not be used as a "
"class variable because just a single list would be shared by all *Dog* "
"instances::"
msgstr ""
"Wie in :ref:`tut-object` besprochen, können geteilte Daten in Verbindung "
"mit :term:`veränderbaren ` Objekten wie Listen und Wörterbüchern "
"überraschende Effekte haben. Die Liste *tricks* im folgenden Code sollte "
"beispielsweise nicht als Klassenvariable verwendet werden, da nur eine "
"einzige Liste von allen *Dog*-Instanzen geteilt würde::"
#: ../../tutorial/classes.rst:428
msgid ""
"class Dog:\n"
"\n"
" tricks = [] # mistaken use of a class variable\n"
"\n"
" def __init__(self, name):\n"
" self.name = name\n"
"\n"
" def add_trick(self, trick):\n"
" self.tricks.append(trick)\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.add_trick('roll over')\n"
">>> e.add_trick('play dead')\n"
">>> d.tricks # unexpectedly shared by all dogs\n"
"['roll over', 'play dead']"
msgstr ""
"class Dog:\n"
"\n"
" tricks = [] # falsche Verwendung einer Klassenvariable\n"
"\n"
" def __init__(self, name):\n"
" self.name = name\n"
"\n"
" def add_trick(self, trick):\n"
" self.tricks.append(trick)\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.add_trick('roll over')\n"
">>> e.add_trick('play dead')\n"
">>> d.tricks # unerwartet von allen Hunden geteilt\n"
"['roll over', 'play dead']"
#: ../../tutorial/classes.rst:445
msgid "Correct design of the class should use an instance variable instead::"
msgstr ""
"Ein korrektes Design der Klasse sollte stattdessen eine Instanzvariable "
"verwenden::"
#: ../../tutorial/classes.rst:447
msgid ""
"class Dog:\n"
"\n"
" def __init__(self, name):\n"
" self.name = name\n"
" self.tricks = [] # creates a new empty list for each dog\n"
"\n"
" def add_trick(self, trick):\n"
" self.tricks.append(trick)\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.add_trick('roll over')\n"
">>> e.add_trick('play dead')\n"
">>> d.tricks\n"
"['roll over']\n"
">>> e.tricks\n"
"['play dead']"
msgstr ""
"class Dog:\n"
"\n"
" def __init__(self, name):\n"
" self.name = name\n"
" self.tricks = [] # erzeugt eine neue leere Liste für jeden Hund\n"
"\n"
" def add_trick(self, trick):\n"
" self.tricks.append(trick)\n"
"\n"
">>> d = Dog('Fido')\n"
">>> e = Dog('Buddy')\n"
">>> d.add_trick('roll over')\n"
">>> e.add_trick('play dead')\n"
">>> d.tricks\n"
"['roll over']\n"
">>> e.tricks\n"
"['play dead']"
#: ../../tutorial/classes.rst:469
msgid "Random Remarks"
msgstr "Ergänzende Hinweise"
#: ../../tutorial/classes.rst:473
msgid ""
"If the same attribute name occurs in both an instance and in a class, then "
"attribute lookup prioritizes the instance::"
msgstr ""
"Tritt derselbe Attributname sowohl in einer Instanz als auch in einer Klasse "
"auf, bevorzugt die Attributsuche die Instanz::"
#: ../../tutorial/classes.rst:476
msgid ""
">>> class Warehouse:\n"
"... purpose = 'storage'\n"
"... region = 'west'\n"
"...\n"
">>> w1 = Warehouse()\n"
">>> print(w1.purpose, w1.region)\n"
"storage west\n"
">>> w2 = Warehouse()\n"
">>> w2.region = 'east'\n"
">>> print(w2.purpose, w2.region)\n"
"storage east"
msgstr ""
">>> class Warehouse:\n"
"... purpose = 'storage'\n"
"... region = 'west'\n"
"...\n"
">>> w1 = Warehouse()\n"
">>> print(w1.purpose, w1.region)\n"
"storage west\n"
">>> w2 = Warehouse()\n"
">>> w2.region = 'east'\n"
">>> print(w2.purpose, w2.region)\n"
"storage east"
#: ../../tutorial/classes.rst:488
msgid ""
"Data attributes may be referenced by methods as well as by ordinary users "
"(\"clients\") of an object. In other words, classes are not usable to "
"implement pure abstract data types. In fact, nothing in Python makes it "
"possible to enforce data hiding --- it is all based upon convention. (On "
"the other hand, the Python implementation, written in C, can completely hide "
"implementation details and control access to an object if necessary; this "
"can be used by extensions to Python written in C.)"
msgstr ""
"Datenattribute können sowohl von Methoden als auch von gewöhnlichen "
"Benutzern („Clients“) eines Objekts referenziert werden. Mit anderen Worten: "
"Klassen sind nicht dazu geeignet, reine abstrakte Datentypen zu "
"implementieren. In Python gibt es tatsächlich nichts, was eine Kapselung "
"(Data Hiding) erzwingen könnte --- alles beruht auf Konventionen. "
"(Andererseits kann die in C geschriebene Python-Implementierung "
"Implementierungsdetails vollständig verbergen und den Zugriff auf ein Objekt "
"bei Bedarf steuern; dies kann von in C geschriebenen Python-Erweiterungen "
"genutzt werden.)"
#: ../../tutorial/classes.rst:496
msgid ""
"Clients should use data attributes with care --- clients may mess up "
"invariants maintained by the methods by stamping on their data attributes. "
"Note that clients may add data attributes of their own to an instance object "
"without affecting the validity of the methods, as long as name conflicts are "
"avoided --- again, a naming convention can save a lot of headaches here."
msgstr ""
"Benutzer sollten Datenattribute mit Vorsicht verwenden --- sie können von "
"Methoden aufrechterhaltene Invarianten beschädigen, indem sie deren "
"Datenattribute überschreiben. Beachte, dass Benutzer einem Instanzobjekt "
"eigene Datenattribute hinzufügen können, ohne die Gültigkeit der Methoden zu "
"beeinträchtigen, solange Namenskonflikte vermieden werden --- auch hier kann "
"eine Namenskonvention viel Ärger ersparen."
#: ../../tutorial/classes.rst:502
msgid ""
"There is no shorthand for referencing data attributes (or other methods!) "
"from within methods. I find that this actually increases the readability of "
"methods: there is no chance of confusing local variables and instance "
"variables when glancing through a method."
msgstr ""
"Es gibt keine Kurzschreibweise, um innerhalb von Methoden auf Datenattribute "
"(oder andere Methoden!) zu verweisen. Dies erhöht tatsächlich die Lesbarkeit "
"von Methoden: Beim Durchsehen einer Methode besteht keine Gefahr, lokale "
"Variablen und Instanzvariablen zu verwechseln."
#: ../../tutorial/classes.rst:507
msgid ""
"Often, the first argument of a method is called ``self``. This is nothing "
"more than a convention: the name ``self`` has absolutely no special meaning "
"to Python. Note, however, that by not following the convention your code "
"may be less readable to other Python programmers, and it is also conceivable "
"that a *class browser* program might be written that relies upon such a "
"convention."
msgstr ""
"Oft wird das erste Argument einer Methode ``self`` genannt. Dies ist nichts "
"weiter als eine Konvention: Der Name ``self`` hat für Python absolut keine "
"spezielle Bedeutung. Beachte jedoch, dass dein Code für andere Python-"
"Programmierer schwerer lesbar sein kann, wenn du dich nicht an diese "
"Konvention hältst, und es ist auch denkbar, dass ein *Class-Browser*-"
"Programm geschrieben wird, das sich auf eine solche Konvention verlässt."
#: ../../tutorial/classes.rst:513
msgid ""
"Any function object that is a class attribute defines a method for instances "
"of that class. It is not necessary that the function definition is "
"textually enclosed in the class definition: assigning a function object to a "
"local variable in the class is also ok. For example::"
msgstr ""
"Jedes Funktionsobjekt, das ein Klassenattribut ist, definiert eine Methode "
"für Instanzen dieser Klasse. Es ist nicht erforderlich, dass die "
"Funktionsdefinition textuell in die Klassendefinition eingeschlossen ist: "
"Das Zuweisen eines Funktionsobjekts zu einer lokalen Variable in der Klasse "
"ist ebenfalls in Ordnung. Zum Beispiel::"
#: ../../tutorial/classes.rst:518
msgid ""
"# Function defined outside the class\n"
"def f1(self, x, y):\n"
" return min(x, x+y)\n"
"\n"
"class C:\n"
" f = f1\n"
"\n"
" def g(self):\n"
" return 'hello world'\n"
"\n"
" h = g"
msgstr ""
"# Außerhalb der Klasse definierte Funktion\n"
"def f1(self, x, y):\n"
" return min(x, x+y)\n"
"\n"
"class C:\n"
" f = f1\n"
"\n"
" def g(self):\n"
" return 'hello world'\n"
"\n"
" h = g"
#: ../../tutorial/classes.rst:530
msgid ""
"Now ``f``, ``g`` and ``h`` are all attributes of class :class:`!C` that "
"refer to function objects, and consequently they are all methods of "
"instances of :class:`!C` --- ``h`` being exactly equivalent to ``g``. Note "
"that this practice usually only serves to confuse the reader of a program."
msgstr ""
"Nun sind ``f``, ``g`` und ``h`` alles Attribute der Klasse :class:`!C`, die "
"auf Funktionsobjekte verweisen, und folglich sind sie alle Methoden von "
"Instanzen von :class:`!C` --- wobei ``h`` genau äquivalent zu ``g`` ist. "
"Beachte, dass diese Praxis gewöhnlich nur dazu dient, den Leser eines "
"Programms zu verwirren."
#: ../../tutorial/classes.rst:535
msgid ""
"Methods may call other methods by using method attributes of the ``self`` "
"argument::"
msgstr ""
"Methoden können andere Methoden aufrufen, indem sie Methodenattribute des "
"\"\n"
"\"``self``-Arguments verwenden::"
#: ../../tutorial/classes.rst:538
msgid ""
"class Bag:\n"
" def __init__(self):\n"
" self.data = []\n"
"\n"
" def add(self, x):\n"
" self.data.append(x)\n"
"\n"
" def addtwice(self, x):\n"
" self.add(x)\n"
" self.add(x)"
msgstr ""
"class Bag:\n"
" def __init__(self):\n"
" self.data = []\n"
"\n"
" def add(self, x):\n"
" self.data.append(x)\n"
"\n"
" def addtwice(self, x):\n"
" self.add(x)\n"
" self.add(x)"
#: ../../tutorial/classes.rst:549
msgid ""
"Methods may reference global names in the same way as ordinary functions. "
"The global scope associated with a method is the module containing its "
"definition. (A class is never used as a global scope.) While one rarely "
"encounters a good reason for using global data in a method, there are many "
"legitimate uses of the global scope: for one thing, functions and modules "
"imported into the global scope can be used by methods, as well as functions "
"and classes defined in it. Usually, the class containing the method is "
"itself defined in this global scope, and in the next section we'll find some "
"good reasons why a method would want to reference its own class."
msgstr ""
"Methoden können auf globale Namen auf dieselbe Weise verweisen wie "
"gewöhnliche Funktionen. Der mit einer Methode verknüpfte globale "
"Gültigkeitsbereich ist das Modul, das ihre Definition enthält. (Eine Klasse "
"wird nie als globaler Gültigkeitsbereich verwendet.) Während man selten "
"einen guten Grund dafür findet, globale Daten in einer Methode zu verwenden, "
"gibt es viele berechtigte Anwendungen für den globalen Gültigkeitsbereich: "
"Zum einen können in den globalen Gültigkeitsbereich importierte Funktionen "
"und Module von Methoden verwendet werden, ebenso wie darin definierte "
"Funktionen und Klassen. Üblicherweise ist die Klasse, die die Methode "
"enthält, selbst in diesem globalen Gültigkeitsbereich definiert, und im "
"nächsten Abschnitt werden wir einige gute Gründe dafür finden, warum eine "
"Methode auf ihre eigene Klasse verweisen möchte."
#: ../../tutorial/classes.rst:559
msgid ""
"Each value is an object, and therefore has a *class* (also called its "
"*type*). It is stored as ``object.__class__``."
msgstr ""
"Jeder Wert ist ein Objekt und hat daher eine *Klasse* (auch *Typ* genannt). "
"Diese ist als ``object.__class__`` gespeichert."
#: ../../tutorial/classes.rst:566
msgid "Inheritance"
msgstr "Vererbung"
#: ../../tutorial/classes.rst:568
msgid ""
"Of course, a language feature would not be worthy of the name \"class\" "
"without supporting inheritance. The syntax for a derived class definition "
"looks like this::"
msgstr ""
"Natürlich wäre ein Sprachfeature des Namens „Klasse“ nicht würdig, wenn es "
"keine Vererbung unterstützen würde. Die Syntax für die Definition einer "
"abgeleiteten Klasse sieht wie folgt aus::"
#: ../../tutorial/classes.rst:572
msgid ""
"class DerivedClassName(BaseClassName):\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
msgstr ""
"class DerivedClassName(BaseClassName):\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
#: ../../tutorial/classes.rst:579
msgid ""
"The name :class:`!BaseClassName` must be defined in a namespace accessible "
"from the scope containing the derived class definition. In place of a base "
"class name, other arbitrary expressions are also allowed. This can be "
"useful, for example, when the base class is defined in another module::"
msgstr ""
"Der Name :class:`!BaseClassName` muss in einem Namensraum definiert sein, "
"der aus dem Gültigkeitsbereich der abgeleiteten Klassendefinition heraus "
"zugänglich ist. Anstelle eines Basisklassennamens sind auch andere beliebige "
"Ausdrücke erlaubt. Dies kann beispielsweise nützlich sein, wenn die "
"Basisklasse in einem anderen Modul definiert ist::"
#: ../../tutorial/classes.rst:585
msgid "class DerivedClassName(modname.BaseClassName):"
msgstr "class DerivedClassName(modname.BaseClassName):"
#: ../../tutorial/classes.rst:587
msgid ""
"Execution of a derived class definition proceeds the same as for a base "
"class. When the class object is constructed, the base class is remembered. "
"This is used for resolving attribute references: if a requested attribute is "
"not found in the class, the search proceeds to look in the base class. This "
"rule is applied recursively if the base class itself is derived from some "
"other class."
msgstr ""
"Die Ausführung einer abgeleiteten Klassendefinition verläuft genauso wie für "
"eine Basisklasse. Wenn das Klassenobjekt erzeugt wird, wird die Basisklasse "
"gemerkt. Dies wird zur Auflösung von Attributreferenzen verwendet: Wird ein "
"angefordertes Attribut nicht in der Klasse gefunden, wird in der Basisklasse "
"weitergesucht. Diese Regel wird rekursiv angewendet, wenn die Basisklasse "
"selbst von einer anderen Klasse abgeleitet ist."
#: ../../tutorial/classes.rst:593
msgid ""
"There's nothing special about instantiation of derived classes: "
"``DerivedClassName()`` creates a new instance of the class. Method "
"references are resolved as follows: the corresponding class attribute is "
"searched, descending down the chain of base classes if necessary, and the "
"method reference is valid if this yields a function object."
msgstr ""
"Die Instanziierung abgeleiteter Klassen weist keine Besonderheiten auf: "
"``DerivedClassName()`` erzeugt eine neue Instanz der Klasse. "
"Methodenreferenzen werden wie folgt aufgelöst: Das entsprechende "
"Klassenattribut wird gesucht, wobei bei Bedarf die Kette der Basisklassen "
"durchsucht wird. Die Methodenreferenz ist gültig, wenn dies ein "
"Funktionsobjekt ergibt."
#: ../../tutorial/classes.rst:599
msgid ""
"Derived classes may override methods of their base classes. Because methods "
"have no special privileges when calling other methods of the same object, a "
"method of a base class that calls another method defined in the same base "
"class may end up calling a method of a derived class that overrides it. "
"(For C++ programmers: all methods in Python are effectively ``virtual``.)"
msgstr ""
"Abgeleitete Klassen können Methoden ihrer Basisklassen überschreiben. Da "
"Methoden keine besonderen Privilegien beim Aufruf anderer Methoden desselben "
"Objekts besitzen, kann das Aufrufen einer in derselben Basisklasse "
"definierten Methode letztlich dazu führen, dass eine Methode einer "
"abgeleiteten Klasse aufgerufen wird, die diese überschreibt. (Für C++ "
"Programmierer: Alle Methoden in Python sind effektiv ``virtual``.)"
#: ../../tutorial/classes.rst:605
msgid ""
"An overriding method in a derived class may in fact want to extend rather "
"than simply replace the base class method of the same name. There is a "
"simple way to call the base class method directly: just call ``BaseClassName."
"methodname(self, arguments)``. This is occasionally useful to clients as "
"well. (Note that this only works if the base class is accessible as "
"``BaseClassName`` in the global scope.)"
msgstr ""
"Eine überschreibende Methode in einer abgeleiteten Klasse möchte die Methode "
"gleichen Namens der Basisklasse womöglich erweitern, anstatt sie einfach zu "
"ersetzen. Es gibt einen einfachen Weg, die Methode der Basisklasse direkt "
"aufzurufen: Man ruft einfach ``BaseClassName.methodname(self, arguments)`` "
"auf. Dies ist gelegentlich auch für Clients nützlich. (Beachte, dass dies "
"nur funktioniert, wenn die Basisklasse als ``BaseClassName`` im globalen "
"Gültigkeitsbereich zugänglich ist.)"
#: ../../tutorial/classes.rst:612
msgid "Python has two built-in functions that work with inheritance:"
msgstr "Python bietet zwei integrierte Funktionen, die mit Vererbung arbeiten:"
#: ../../tutorial/classes.rst:614
msgid ""
"Use :func:`isinstance` to check an instance's type: ``isinstance(obj, int)`` "
"will be ``True`` only if ``obj.__class__`` is :class:`int` or some class "
"derived from :class:`int`."
msgstr ""
"Verwende :func:`isinstance`, um den Typ einer Instanz zu überprüfen: "
"``isinstance(obj, int)`` ist nur dann ``True``, wenn ``obj.__class__`` "
"gleich :class:`int` oder einer von :class:`int` abgeleiteten Klasse ist."
#: ../../tutorial/classes.rst:618
msgid ""
"Use :func:`issubclass` to check class inheritance: ``issubclass(bool, int)`` "
"is ``True`` since :class:`bool` is a subclass of :class:`int`. However, "
"``issubclass(float, int)`` is ``False`` since :class:`float` is not a "
"subclass of :class:`int`."
msgstr ""
"Verwende :func:`issubclass`, um die Klassenvererbung zu überprüfen: "
"``issubclass(bool, int)`` ist ``True``, da :class:`bool` eine Unterklasse "
"von :class:`int` ist. ``issubclass(float, int)`` ist jedoch ``False``, da :"
"class:`float` keine Unterklasse von :class:`int` ist."
#: ../../tutorial/classes.rst:628
msgid "Multiple Inheritance"
msgstr "Mehrfachvererbung"
#: ../../tutorial/classes.rst:630
msgid ""
"Python supports a form of multiple inheritance as well. A class definition "
"with multiple base classes looks like this::"
msgstr ""
"Python unterstützt auch eine Form der Mehrfachvererbung. Eine "
"Klassendefinition mit mehreren Basisklassen sieht wie folgt aus::"
#: ../../tutorial/classes.rst:633
msgid ""
"class DerivedClassName(Base1, Base2, Base3):\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
msgstr ""
"class DerivedClassName(Base1, Base2, Base3):\n"
" \n"
" .\n"
" .\n"
" .\n"
" "
#: ../../tutorial/classes.rst:640
msgid ""
"For most purposes, in the simplest cases, you can think of the search for "
"attributes inherited from a parent class as depth-first, left-to-right, not "
"searching twice in the same class where there is an overlap in the "
"hierarchy. Thus, if an attribute is not found in :class:`!DerivedClassName`, "
"it is searched for in :class:`!Base1`, then (recursively) in the base "
"classes of :class:`!Base1`, and if it was not found there, it was searched "
"for in :class:`!Base2`, and so on."
msgstr ""
"Für die meisten Zwecke kann man sich die Suche nach Attributen, die von "
"einer Elternklasse geerbt wurden, in den einfachsten Fällen als Tiefensuche "
"von links nach rechts vorstellen, bei der dieselbe Klasse bei "
"Überschneidungen in der Hierarchie nicht zweimal durchsucht wird. Wenn ein "
"Attribut also nicht in :class:`!DerivedClassName` gefunden wird, wird in :"
"class:`!Base1` gesucht, dann (rekursiv) in den Basisklassen von :class:`!"
"Base1`, und falls es dort nicht gefunden wurde, wird in :class:`!Base2` "
"gesucht und so weiter."
#: ../../tutorial/classes.rst:647
msgid ""
"In fact, it is slightly more complex than that; the method resolution order "
"changes dynamically to support cooperative calls to :func:`super`. This "
"approach is known in some other multiple-inheritance languages as call-next-"
"method and is more powerful than the super call found in single-inheritance "
"languages."
msgstr ""
"Tatsächlich ist es etwas komplexer: Die Method Auflösungsreihenfolge (Method "
"Resolution Order) ändert sich dynamisch, um kooperative Aufrufe von :func:"
"`super` zu unterstützen. Dieser Ansatz ist in einigen anderen Sprachen mit "
"Mehrfachvererbung als „call-next-method“ bekannt und ist mächtiger als der "
"Super-Aufruf in Sprachen mit einfacher Vererbung."
#: ../../tutorial/classes.rst:653
msgid ""
"Dynamic ordering is necessary because all cases of multiple inheritance "
"exhibit one or more diamond relationships (where at least one of the parent "
"classes can be accessed through multiple paths from the bottommost class). "
"For example, all classes inherit from :class:`object`, so any case of "
"multiple inheritance provides more than one path to reach :class:`object`. "
"To keep the base classes from being accessed more than once, the dynamic "
"algorithm linearizes the search order in a way that preserves the left-to-"
"right ordering specified in each class, that calls each parent only once, "
"and that is monotonic (meaning that a class can be subclassed without "
"affecting the precedence order of its parents). Taken together, these "
"properties make it possible to design reliable and extensible classes with "
"multiple inheritance. For more detail, see :ref:`python_2.3_mro`."
msgstr ""
"Eine dynamische Reihenfolge ist erforderlich, da alle Fälle von "
"Mehrfachvererbung eine oder mehrere Diamant-Beziehungen aufweisen (bei denen "
"auf mindestens eine der Elternklassen über mehrere Pfade von der untersten "
"Klasse aus zugegriffen werden kann). So erben beispielsweise alle Klassen "
"von :class:`object`, sodass jeder Fall von Mehrfachvererbung mehr als einen "
"Pfad bietet, um :class:`object` zu erreichen. Um zu verhindern, dass auf die "
"Basisklassen mehr als einmal zugegriffen wird, linearisiert der dynamische "
"Algorithmus die Suchreihenfolge so, dass die in jeder Klasse angegebene "
"Reihenfolge von links nach rechts erhalten bleibt, jede Elternklasse nur "
"einmal aufgerufen wird und die Reihenfolge monoton ist (was bedeutet, dass "
"von einer Klasse abgeleitet werden kann, ohne die Vorrangstellung ihrer "
"Elternklassen zu beeinträchtigen). Zusammengefasst ermöglichen diese "
"Eigenschaften den Entwurf zuverlässiger und erweiterbarer Klassen mit "
"Mehrfachvererbung. Weitere Details findest du unter :ref:`python_2.3_mro`."
#: ../../tutorial/classes.rst:670
msgid "Private Variables"
msgstr "Private Variablen"
#: ../../tutorial/classes.rst:672
msgid ""
"\"Private\" instance variables that cannot be accessed except from inside an "
"object don't exist in Python. However, there is a convention that is "
"followed by most Python code: a name prefixed with an underscore (e.g. "
"``_spam``) should be treated as a non-public part of the API (whether it is "
"a function, a method or a data member). It should be considered an "
"implementation detail and subject to change without notice."
msgstr ""
"Private“ Instanzvariablen, auf die nur von innerhalb eines Objekts "
"zugegriffen werden kann, gibt es in Python nicht. Es gibt jedoch eine "
"Konvention, an die sich der meiste Python-Code hält: Ein Name mit einem "
"führenden Unterstrich (z. B. ``_spam``) sollte als nicht-öffentlicher Teil "
"der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, "
"eine Methode oder ein Datenelement handelt). Er sollte als "
"Implementierungsdetail betrachtet werden, das sich ohne Ankündigung ändern "
"kann."
#: ../../tutorial/classes.rst:682
msgid ""
"Since there is a valid use-case for class-private members (namely to avoid "
"name clashes of names with names defined by subclasses), there is limited "
"support for such a mechanism, called :dfn:`name mangling`. Any identifier "
"of the form ``__spam`` (at least two leading underscores, at most one "
"trailing underscore) is textually replaced with ``_classname__spam``, where "
"``classname`` is the current class name with leading underscore(s) "
"stripped. This mangling is done without regard to the syntactic position of "
"the identifier, as long as it occurs within the definition of a class."
msgstr ""
"Da es einen berechtigten Anwendungsfall für klassenprivate Elemente gibt "
"(nämlich das Vermeiden von Namenskollisionen mit Namen, die von Unterklassen "
"definiert werden), gibt es eine begrenzte Unterstützung für einen solchen "
"Mechanismus, der als :dfn:`Name-Mangling` bezeichnet wird. Jeder Bezeichner "
"der Form ``__spam`` (mindestens zwei führende Unterstriche, höchstens ein "
"nachstehender Unterstrich) wird textuell durch ``_classname__spam`` ersetzt, "
"wobei ``classname`` der aktuelle Klassenname ohne führende Unterstriche ist. "
"Diese Umbenennung (Mangling) erfolgt ohne Rücksicht auf die syntaktische "
"Position des Bezeichners, solange es innerhalb der Definition einer Klasse "
"auftritt."
#: ../../tutorial/classes.rst:693
msgid ""
"The :ref:`private name mangling specifications ` for "
"details and special cases."
msgstr ""
"Die :ref:`Spezifikationen zur Namensumbenennung privater Elemente ` für Details und Spezialfälle."
#: ../../tutorial/classes.rst:696
msgid ""
"Name mangling is helpful for letting subclasses override methods without "
"breaking intraclass method calls. For example::"
msgstr ""
"Die Namensumbenennung ist nützlich, um Unterklassen das Überschreiben von "
"Methoden zu ermöglichen, ohne interne Methodenaufrufe innerhalb der Klasse "
"zu beeinträchtigen. Zum Beispiel::"
#: ../../tutorial/classes.rst:699
msgid ""
"class Mapping:\n"
" def __init__(self, iterable):\n"
" self.items_list = []\n"
" self.__update(iterable)\n"
"\n"
" def update(self, iterable):\n"
" for item in iterable:\n"
" self.items_list.append(item)\n"
"\n"
" __update = update # private copy of original update() method\n"
"\n"
"class MappingSubclass(Mapping):\n"
"\n"
" def update(self, keys, values):\n"
" # provides new signature for update()\n"
" # but does not break __init__()\n"
" for item in zip(keys, values):\n"
" self.items_list.append(item)"
msgstr ""
"class Mapping:\n"
" def __init__(self, iterable):\n"
" self.items_list = []\n"
" self.__update(iterable)\n"
"\n"
" def update(self, iterable):\n"
" for item in iterable:\n"
" self.items_list.append(item)\n"
"\n"
" __update = update # private Kopie der ursprünglichen Methode update()\n"
"\n"
"class MappingSubclass(Mapping):\n"
"\n"
" def update(self, keys, values):\n"
" # provides new signature for update()\n"
" # but does not break __init__()\n"
" for item in zip(keys, values):\n"
" self.items_list.append(item)"
#: ../../tutorial/classes.rst:718
msgid ""
"The above example would work even if ``MappingSubclass`` were to introduce a "
"``__update`` identifier since it is replaced with ``_Mapping__update`` in "
"the ``Mapping`` class and ``_MappingSubclass__update`` in the "
"``MappingSubclass`` class respectively."
msgstr ""
"Das obige Beispiel würde selbst dann funktionieren, wenn ``MappingSubclass`` "
"einen ``__update``-Bezeichner einführen würde, da dieser in der Klasse "
"``Mapping`` durch ``_Mapping__update`` bzw. in der Klasse "
"``MappingSubclass`` durch ``_MappingSubclass__update`` ersetzt wird."
#: ../../tutorial/classes.rst:723
msgid ""
"Note that the mangling rules are designed mostly to avoid accidents; it "
"still is possible to access or modify a variable that is considered "
"private. This can even be useful in special circumstances, such as in the "
"debugger."
msgstr ""
"Beachte, dass die Regeln zur Namensumbenennung hauptsächlich dazu dienen, "
"unbeabsichtigte Kollisionen zu vermeiden. Es ist weiterhin möglich, auf eine "
"Variable zuzugreifen oder diese zu verändern, die als privat gilt. Dies kann "
"unter besonderen Umständen sogar nützlich sein, beispielsweise im Debugger."
#: ../../tutorial/classes.rst:727
msgid ""
"Notice that code passed to ``exec()`` or ``eval()`` does not consider the "
"classname of the invoking class to be the current class; this is similar to "
"the effect of the ``global`` statement, the effect of which is likewise "
"restricted to code that is byte-compiled together. The same restriction "
"applies to ``getattr()``, ``setattr()`` and ``delattr()``, as well as when "
"referencing ``__dict__`` directly."
msgstr ""
"Beachte, dass Code, der an ``exec()`` oder ``eval()`` übergeben wird, den "
"Klassennamen der aufrufenden Klasse nicht als die aktuelle Klasse ansieht. "
"Dies ähnelt der Wirkung der ``global``-Anweisung, deren Wirkung ebenfalls "
"auf Code beschränkt ist, der zusammen byte-kompiliert wird. Die gleiche "
"Einschränkung gilt für ``getattr()``, ``setattr()`` und ``delattr()`` sowie "
"für die direkte Referenzierung von ``__dict__``."
#: ../../tutorial/classes.rst:738
msgid "Odds and Ends"
msgstr "Dies und Das"
#: ../../tutorial/classes.rst:740
msgid ""
"Sometimes it is useful to have a data type similar to the Pascal \"record\" "
"or C \"struct\", bundling together a few named data items. The idiomatic "
"approach is to use :mod:`dataclasses` for this purpose::"
msgstr ""
"Manchmal ist ein Datentyp nützlich, der dem „record“ in Pascal oder der "
"„struct“ in C ähnelt und einige benannte Datenobjekte bündelt. Der "
"idiomatische Ansatz hierfür ist die Verwendung von :mod:`dataclasses`::"
#: ../../tutorial/classes.rst:744
msgid ""
"from dataclasses import dataclass\n"
"\n"
"@dataclass\n"
"class Employee:\n"
" name: str\n"
" dept: str\n"
" salary: int"
msgstr ""
"from dataclasses import dataclass\n"
"\n"
"@dataclass\n"
"class Employee:\n"
" name: str\n"
" dept: str\n"
" salary: int"
#: ../../tutorial/classes.rst:754
msgid ""
">>> john = Employee('john', 'computer lab', 1000)\n"
">>> john.dept\n"
"'computer lab'\n"
">>> john.salary\n"
"1000"
msgstr ""
">>> john = Employee('john', 'computer lab', 1000)\n"
">>> john.dept\n"
"'computer lab'\n"
">>> john.salary\n"
"1000"
#: ../../tutorial/classes.rst:760
msgid ""
"A piece of Python code that expects a particular abstract data type can "
"often be passed a class that emulates the methods of that data type "
"instead. For instance, if you have a function that formats some data from a "
"file object, you can define a class with methods :meth:`~io.TextIOBase.read` "
"and :meth:`~io.TextIOBase.readline` that get the data from a string buffer "
"instead, and pass it as an argument."
msgstr ""
"Einem Stück Python-Code, das einen bestimmten abstrakten Datentyp erwartet, "
"kann oft stattdessen eine Klasse übergeben werden, die die Methoden dieses "
"Datentyps emuliert. Wenn du beispielsweise eine Funktion hast, die Daten aus "
"einem Dateiobjekt formatiert, kannst du eine Klasse mit den Methoden :meth:"
"`~io.TextIOBase.read` und :meth:`~io.TextIOBase.readline` definieren, die "
"die Daten stattdessen aus einem String-Puffer bezieht, und eine Instanz "
"davon als Argument übergeben."
#: ../../tutorial/classes.rst:772
msgid ""
":ref:`Instance method objects ` have attributes, too: :"
"attr:`m.__self__ ` is the instance object with the method :"
"meth:`!m`, and :attr:`m.__func__ ` is the :ref:`function "
"object ` corresponding to the method."
msgstr ""
":ref:`Instanzmethoden-Objekte ` besitzen ebenfalls "
"Attribute: :attr:`m.__self__ ` ist das Instanzobjekt mit "
"der Methode :meth:`!m`, und :attr:`m.__func__ ` ist das der "
"Methode entsprechende :ref:`Funktionsobjekt `."
#: ../../tutorial/classes.rst:782
msgid "Iterators"
msgstr "Iteratoren"
#: ../../tutorial/classes.rst:784
msgid ""
"By now you have probably noticed that most container objects can be looped "
"over using a :keyword:`for` statement::"
msgstr ""
"Inzwischen hast du wahrscheinlich bemerkt, dass über die meisten Container-"
"Objekte mit einer :keyword:`for`-Anweisung iteriert werden kann::"
#: ../../tutorial/classes.rst:787
msgid ""
"for element in [1, 2, 3]:\n"
" print(element)\n"
"for element in (1, 2, 3):\n"
" print(element)\n"
"for key in {'one':1, 'two':2}:\n"
" print(key)\n"
"for char in \"123\":\n"
" print(char)\n"
"for line in open(\"myfile.txt\"):\n"
" print(line, end='')"
msgstr ""
"for element in [1, 2, 3]:\n"
" print(element)\n"
"for element in (1, 2, 3):\n"
" print(element)\n"
"for key in {'one':1, 'two':2}:\n"
" print(key)\n"
"for char in \"123\":\n"
" print(char)\n"
"for line in open(\"myfile.txt\"):\n"
" print(line, end='')"
#: ../../tutorial/classes.rst:798
msgid ""
"This style of access is clear, concise, and convenient. The use of "
"iterators pervades and unifies Python. Behind the scenes, the :keyword:"
"`for` statement calls :func:`iter` on the container object. The function "
"returns an iterator object that defines the method :meth:`~iterator."
"__next__` which accesses elements in the container one at a time. When "
"there are no more elements, :meth:`~iterator.__next__` raises a :exc:"
"`StopIteration` exception which tells the :keyword:`!for` loop to "
"terminate. You can call the :meth:`~iterator.__next__` method using the :"
"func:`next` built-in function; this example shows how it all works::"
msgstr ""
"Diese Art des Zugriffs ist klar, prägnant und bequem. Die Verwendung von "
"Iteratoren durchzieht und vereinheitlicht Python. Hinter den Kulissen ruft "
"die :keyword:`for`-Anweisung :func:`iter` für das Container-Objekt auf. Die "
"Funktion gibt ein Iterator-Objekt zurück, das die Methode :meth:`~iterator."
"__next__` definiert, welche nacheinander auf die Elemente im Container "
"zugreift. Wenn keine Elemente mehr vorhanden sind, löst :meth:`~iterator."
"__next__` eine :exc:`StopIteration`-Ausnahme aus, die der :keyword:`!for`-"
"Schleife mitteilt, dass sie beendet werden soll. Du kannst die Methode :meth:"
"`~iterator.__next__` über die integrierte Funktion :func:`next` aufrufen. "
"Dieses Beispiel zeigt, wie das Ganze funktioniert::\""
#: ../../tutorial/classes.rst:807
msgid ""
">>> s = 'abc'\n"
">>> it = iter(s)\n"
">>> it\n"
"\n"
">>> next(it)\n"
"'a'\n"
">>> next(it)\n"
"'b'\n"
">>> next(it)\n"
"'c'\n"
">>> next(it)\n"
"Traceback (most recent call last):\n"
" File \"\", line 1, in \n"
" next(it)\n"
"StopIteration"
msgstr ""
">>> s = 'abc'\n"
">>> it = iter(s)\n"
">>> it\n"
"\n"
">>> next(it)\n"
"'a'\n"
">>> next(it)\n"
"'b'\n"
">>> next(it)\n"
"'c'\n"
">>> next(it)\n"
"Traceback (most recent call last):\n"
" File \"\", line 1, in \n"
" next(it)\n"
"StopIteration"
#: ../../tutorial/classes.rst:823
msgid ""
"Having seen the mechanics behind the iterator protocol, it is easy to add "
"iterator behavior to your classes. Define an :meth:`~container.__iter__` "
"method which returns an object with a :meth:`~iterator.__next__` method. If "
"the class defines :meth:`!__next__`, then :meth:`!__iter__` can just return "
"``self``::"
msgstr ""
"Nachdem du die Mechanik hinter dem Iterator-Protokoll gesehen hast, ist es "
"einfach, deinen Klassen Iterator-Verhalten hinzuzufügen. Definiere eine :"
"meth:`~container.__iter__`-Methode, die ein Objekt mit einer :meth:"
"`~iterator.__next__`-Methode zurückgibt. Wenn die Klasse :meth:`!__next__` "
"definiert, kann :meth:`!__iter__` einfach ``self`` zurückgeben::"
#: ../../tutorial/classes.rst:828
msgid ""
"class Reverse:\n"
" \"\"\"Iterator for looping over a sequence backwards.\"\"\"\n"
" def __init__(self, data):\n"
" self.data = data\n"
" self.index = len(data)\n"
"\n"
" def __iter__(self):\n"
" return self\n"
"\n"
" def __next__(self):\n"
" if self.index == 0:\n"
" raise StopIteration\n"
" self.index = self.index - 1\n"
" return self.data[self.index]"
msgstr ""
"class Reverse:\n"
" \"\"\"Iterator for looping over a sequence backwards.\"\"\"\n"
" def __init__(self, data):\n"
" self.data = data\n"
" self.index = len(data)\n"
"\n"
" def __iter__(self):\n"
" return self\n"
"\n"
" def __next__(self):\n"
" if self.index == 0:\n"
" raise StopIteration\n"
" self.index = self.index - 1\n"
" return self.data[self.index]"
#: ../../tutorial/classes.rst:845
msgid ""
">>> rev = Reverse('spam')\n"
">>> iter(rev)\n"
"\n"
">>> for char in rev:\n"
"... print(char)\n"
"...\n"
"m\n"
"a\n"
"p\n"
"s"
msgstr ""
">>> rev = Reverse('spam')\n"
">>> iter(rev)\n"
"\n"
">>> for char in rev:\n"
"... print(char)\n"
"...\n"
"m\n"
"a\n"
"p\n"
"s"
#: ../../tutorial/classes.rst:860
msgid "Generators"
msgstr "Generatoren"
#: ../../tutorial/classes.rst:862
msgid ""
":term:`Generators ` are a simple and powerful tool for creating "
"iterators. They are written like regular functions but use the :keyword:"
"`yield` statement whenever they want to return data. Each time :func:`next` "
"is called on it, the generator resumes where it left off (it remembers all "
"the data values and which statement was last executed). An example shows "
"that generators can be trivially easy to create::"
msgstr ""
":term:`Generatoren ` sind ein einfaches und mächtiges Werkzeug "
"zum Erstellen von Iteratoren. Sie werden wie gewöhnliche Funktionen "
"geschrieben, verwenden aber die :keyword:`yield`-Anweisung, wann immer sie "
"Daten zurückgeben wollen. Jedes Mal, wenn :func:`next` darauf aufgerufen "
"wird, setzt der Generator an der Stelle fort, an der er aufgehört hat (er "
"merkt sich alle Datenwerte und welche Anweisung zuletzt ausgeführt wurde). "
"Ein Beispiel zeigt, dass Generatoren denkbar einfach zu erstellen sind::"
#: ../../tutorial/classes.rst:869
msgid ""
"def reverse(data):\n"
" for index in range(len(data)-1, -1, -1):\n"
" yield data[index]"
msgstr ""
"def reverse(data):\n"
" for index in range(len(data)-1, -1, -1):\n"
" yield data[index]"
#: ../../tutorial/classes.rst:875
msgid ""
">>> for char in reverse('golf'):\n"
"... print(char)\n"
"...\n"
"f\n"
"l\n"
"o\n"
"g"
msgstr ""
">>> for char in reverse('golf'):\n"
"... print(char)\n"
"...\n"
"f\n"
"l\n"
"o\n"
"g"
#: ../../tutorial/classes.rst:883
msgid ""
"Anything that can be done with generators can also be done with class-based "
"iterators as described in the previous section. What makes generators so "
"compact is that the :meth:`~iterator.__iter__` and :meth:`~generator."
"__next__` methods are created automatically."
msgstr ""
"Alles, was mit Generatoren gemacht werden kann, lässt sich auch mit "
"klassenbasierten Iteratoren umsetzen, wie im vorherigen Abschnitt "
"beschrieben. Was Generatoren so kompakt macht, ist, dass die Methoden :meth:"
"`~iterator.__iter__` und :meth:`~generator.__next__` automatisch erstellt "
"werden."
#: ../../tutorial/classes.rst:888
msgid ""
"Another key feature is that the local variables and execution state are "
"automatically saved between calls. This made the function easier to write "
"and much more clear than an approach using instance variables like ``self."
"index`` and ``self.data``."
msgstr ""
"Ein weiteres Schlüsselelement ist, dass die lokalen Variablen und der "
"Ausführungszustand zwischen den Aufrufen automatisch gespeichert werden. "
"Dadurch war die Funktion einfacher zu schreiben und viel übersichtlicher als "
"ein Ansatz mit Instanzvariablen wie ``self.index`` und ``self.data``."
#: ../../tutorial/classes.rst:893
msgid ""
"In addition to automatic method creation and saving program state, when "
"generators terminate, they automatically raise :exc:`StopIteration`. In "
"combination, these features make it easy to create iterators with no more "
"effort than writing a regular function."
msgstr ""
"Neben der automatischen Methodenerstellung und dem Speichern des "
"Programmzustands lösen Generatoren beim Beenden automatisch :exc:"
"`StopIteration` aus. In Kombination machen es diese Funktionen einfach, "
"Iteratoren mit nicht mehr Aufwand als beim Schreiben einer normalen Funktion "
"zu erstellen."
#: ../../tutorial/classes.rst:902
msgid "Generator Expressions"
msgstr "Generator-Ausdrücke"
#: ../../tutorial/classes.rst:904
msgid ""
"Some simple generators can be coded succinctly as expressions using a syntax "
"similar to list comprehensions but with parentheses instead of square "
"brackets. These expressions are designed for situations where the generator "
"is used right away by an enclosing function. Generator expressions are more "
"compact but less versatile than full generator definitions and tend to be "
"more memory friendly than equivalent list comprehensions."
msgstr ""
"Einige einfache Generatoren können prägnant als Ausdrücke geschrieben "
"werden, wobei eine Syntax ähnlich der von List-Comprehensions verwendet "
"wird, jedoch mit runden statt eckigen Klammern. Diese Ausdrücke sind für "
"Situationen konzipiert, in denen der Generator direkt von einer umgebenden "
"Funktion verwendet wird. Generator-Ausdrücke sind kompakter, aber weniger "
"vielseitig als vollständige Generator-Definitionen und tendenziell "
"speicherschonender als entsprechende List-Comprehensions."
#: ../../tutorial/classes.rst:911
msgid "Examples::"
msgstr "Beispiele::"
#: ../../tutorial/classes.rst:913
msgid ""
">>> sum(i*i for i in range(10)) # sum of squares\n"
"285\n"
"\n"
">>> xvec = [10, 20, 30]\n"
">>> yvec = [7, 5, 3]\n"
">>> sum(x*y for x,y in zip(xvec, yvec)) # dot product\n"
"260\n"
"\n"
">>> unique_words = set(word for line in page for word in line.split())\n"
"\n"
">>> valedictorian = max((student.gpa, student.name) for student in "
"graduates)\n"
"\n"
">>> data = 'golf'\n"
">>> list(data[i] for i in range(len(data)-1, -1, -1))\n"
"['f', 'l', 'o', 'g']"
msgstr ""
">>> sum(i*i for i in range(10)) # Summe der Quadrate\n"
"285\n"
"\n"
">>> xvec = [10, 20, 30]\n"
">>> yvec = [7, 5, 3]\n"
">>> sum(x*y for x,y in zip(xvec, yvec)) # Skalarprodukt\n"
"260\n"
"\n"
">>> unique_words = set(word for line in page for word in line.split())\n"
"\n"
">>> valedictorian = max((student.gpa, student.name) for student in "
"graduates)\n"
"\n"
">>> data = 'golf'\n"
">>> list(data[i] for i in range(len(data)-1, -1, -1))\n"
"['f', 'l', 'o', 'g']"
#: ../../tutorial/classes.rst:932
msgid "Footnotes"
msgstr "Fußnoten"
#: ../../tutorial/classes.rst:933
msgid ""
"Except for one thing. Module objects have a secret read-only attribute "
"called :attr:`~object.__dict__` which returns the dictionary used to "
"implement the module's namespace; the name ``__dict__`` is an attribute but "
"not a global name. Obviously, using this violates the abstraction of "
"namespace implementation, and should be restricted to things like post-"
"mortem debuggers."
msgstr ""
"Bis auf eine Sache. Modulobjekte haben ein geheimes schreibgeschütztes "
"Attribut namens :attr:`~object.__dict__`, welches das Dictionary zurückgibt, "
"das zur Implementierung des Namensraums des Moduls verwendet wird; der Name "
"``__dict__`` ist ein Attribut, aber kein globaler Name. Offensichtlich "
"verletzt die Verwendung dieses Attributs die Abstraktion der Namensraum-"
"Implementierung und sollte auf Dinge wie Post-Mortem-Debugger beschränkt "
"werden."
#: ../../tutorial/classes.rst:343
msgid "object"
msgstr "Objekt"
#: ../../tutorial/classes.rst:343
msgid "method"
msgstr "Methode"
#: ../../tutorial/classes.rst:679
msgid "name"
msgstr "Namen"
#: ../../tutorial/classes.rst:679
msgid "mangling"
msgstr "Umbenennung"
#~ msgid ""
#~ "As discussed in :ref:`tut-object`, shared data can have possibly "
#~ "surprising effects with involving :term:`mutable` objects such as lists "
#~ "and dictionaries. For example, the *tricks* list in the following code "
#~ "should not be used as a class variable because just a single list would "
#~ "be shared by all *Dog* instances::"
#~ msgstr ""
#~ "Wie in :ref:`tut-object` besprochen, können geteilte Daten in Verbindung "
#~ "mit :term:`veränderbaren ` Objekten wie Listen und Wörterbüchern "
#~ "überraschende Effekte haben. Die Liste *tricks* im folgenden Code sollte "
#~ "beispielsweise nicht als Klassenvariable verwendet werden, da nur eine "
#~ "einzige Liste von allen *Dog*-Instanzen geteilt würde::"