Discussion:
[Python-de] Unterklassen von eingebauten Typen definieren
Gregor Lingl
2003-05-28 14:15:44 UTC
Permalink
Hallo pythonistas!

Ich m?chte gerne folgendes wissen:

Ich leite eine Klasse in folgender Weise vom
pass
a = L()
a
[]
b = L([1,2,3])
b
[1, 2, 3]
c = L("xyz")
c
['x', 'y', 'z']
L scheint list als Konstruktor zu ben?tzen, oder
es verh?lt sich wenigstens so als ob.
def __init__(self, x):
self.x = x
e = M(3)
e
[]
e.x
3

Der Konstruktor von M konstruiert nur leere Listen.
Wie kann ich einen Konstruktor definieren, der zum Beispiel
als erstes Argument eine Sequenz ?bernimmt um sich als Liste
zu initialisieren und dann noch weitere Argumente f?r andere
Zwecke?
def __init__(self, seq, x):
self.x = x
self.extend(seq)
f = N( (3,4,5), "C" )
f
[3, 4, 5]
f.x
'C'
Mir scheint jedoch, dass das nicht der kanonsche Weg ist, solche
Dinge zu erledigen, denn er h?ngt von der Existenz der Methode
extends ab, die es nur f?r Listen gibt. Dagegen stellt sich das
angegebene Problem allgemein bei der Definition von Unterklassen
f?r eingebauten Typen.

Wer wei?, wie das "regelgerecht" gemacht wird?

mit freundlichen Gr??en,
Gregor
Gerhard Häring
2003-05-28 14:15:44 UTC
Permalink
Post by Gregor Lingl
Hallo pythonistas!
Die Dokumentation daf?r sehr sp?rlich ist: </yoda>
http://www.python.org/2.2.1/descrintro.html
Post by Gregor Lingl
pass
a = L()
a
[]
b = L([1,2,3])
b
[1, 2, 3]
c = L("xyz")
c
['x', 'y', 'z']
L scheint list als Konstruktor zu ben?tzen, oder
es verh?lt sich wenigstens so als ob.
self.x = x
Du hast vergessen, dass du noch den Konstruktor der Oberklasse aufrufen
musst: list.__init__(self, x)

Hier ein kleines Beispiel:

class M(list):
def __init__(self, initparm, doUpperCase=0):
if doUpperCase:
initparm = [x.upper() for x in initparm]
list.__init__(self, initparm)

m = M(("a", "A", "b"), 1)
print m

-- Gerhard
Gregor Lingl
2003-05-28 14:15:44 UTC
Permalink
Post by Gerhard Häring
Post by Gregor Lingl
Hallo pythonistas!
Die Dokumentation daf?r sehr sp?rlich ist: </yoda>
http://www.python.org/2.2.1/descrintro.html
Post by Gregor Lingl
pass
a = L()
a
[]
b = L([1,2,3])
b
[1, 2, 3]
c = L("xyz")
c
['x', 'y', 'z']
L scheint list als Konstruktor zu ben?tzen, oder
es verh?lt sich wenigstens so als ob.
self.x = x
Du hast vergessen, dass du noch den Konstruktor der Oberklasse aufrufen
musst: list.__init__(self, x)
initparm = [x.upper() for x in initparm]
list.__init__(self, initparm)
m = M(("a", "A", "b"), 1)
print m
-- Gerhard
Danke! - Vergessen? Na ja, mir war nicht klar, dass die eingebauten
Typen auch eine
__init__-Methode haben. (Und um eine leere abgeleitete Liste zu
erhalten, muss dieser
Konstruktor offenbar auch nicht aufgerufen werden, die gibts anscheinend
automatisch.)

Gregor
Gregor Lingl
2003-05-28 14:15:44 UTC
Permalink
Hallo!
pass
pass
c=C()
n=N()
c
<__main__.C instance at 0x0093C160>
n
<__main__.N object at 0x0092D158>
dir(c)
['__doc__', '__module__']
dir(n)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__',
'__repr__', '__setattr__', '__str__', '__weakref__']
Da scheint es wesentliche Neuerungen zu geben.
Kann jemand eine knappe Liste der Vorteile aufstellen,
die die Benutzung von N und n bringt im Vergleich zur
Benutztung von C und c?

Gregor
Gerhard Häring
2003-05-28 14:15:44 UTC
Permalink
Kann jemand eine knappe Liste der Vorteile aufstellen, die die
Benutzung von N und n bringt im Vergleich zur Benutztung von C und c?
Du kannst Metaklassen, Slots und Properties verwenden, was mit den alten
Klassen nicht geht. Sonst f?llt mir momentan nix ein. Ist aber noch fr?h
und ich geh heut aufs O-Fest :-)

-- Gerhard
Martin v. Loewis
2003-05-28 14:15:44 UTC
Permalink
Post by Gregor Lingl
Kann jemand eine knappe Liste der Vorteile aufstellen,
die die Benutzung von N und n bringt im Vergleich zur
Benutztung von C und c?
Im konkreten Beispiel ergeben sich keinerlei Vorteile in der
Verwendung von N gegen?ber C. Hauptunterschied ist, dass type(n) N
ist, w?hrend type(c) types.ClassType ist.

Ciao,
Martin

Rainer Fischbach
2003-05-28 14:15:44 UTC
Permalink
---------- Original Message ----------------------------------
From: Gregor Lingl <***@aon.at>
Reply-To: python-***@python.net
Date: Mon, 30 Sep 2002 09:02:55 +0200
Post by Gregor Lingl
Hallo!
...
Da scheint es wesentliche Neuerungen zu geben.
Kann jemand eine knappe Liste der Vorteile aufstellen,
die die Benutzung von N und n bringt im Vergleich zur
Benutztung von C und c?
studier mal das hier:
Guido van Rossum: Unifying types and classes in Python 2.2
<http://www.python.org/2.2.1/descrintro.html>

sl, Rainer
Lesen Sie weiter auf narkive:
Suchergebnisse für '[Python-de] Unterklassen von eingebauten Typen definieren' (Fragen und Antworten)
3
Antworten
Was bedeutet "Japan im Feudalismus"??
gestartet 2007-05-23 11:54:08 UTC
geschichte
Loading...