einigen von euch, wie z.B. Milan ist sicher aufgefallen, daß ich Klassen meist von object ableite. Das ist jetzt nicht mein persönlicher Programmierstiel, sondern hat schon seinen Grund.
Klassen die von eingebauten Klassen, deren einfachste object ist, abgeleitet werden, sind seit Python 2.2.3 sogenannte New-style Klassen. Diese haben gegenüber herkömmlichen Klassen einige Vorteile.
1. Slots:
wenn in der Klasse eine Liste __slots__ definiert ist, so können nur Attribute angelegt werden, die in der Liste aufgeführt werden. Es können also nicht, wie es bei herkömmlichen Klassen möglich ist, zur Laufzeit neue Attribute einer Instanz der Klasse zugewiesen werden.
Code: Alles auswählen
class Oldstyle:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
class Newstyle(object):
__slots__ = ["a", "b", "c"]
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
oldobj = Oldstyle()
oldobj.d = 4 # funktioniert
newobj = Newstyle()
newobj.d = 4 # gibt eine Fehlermeldung
Properties definieren so eine Art Pseudoattribute. Bei herkömmlichen Klassen mussten dafür die Spezialmethoden __getattr__ und __setattr_ redefiniert werden, was oft nicht ganz einfach war.
Code: Alles auswählen
class RGB(object):
__slots__ = ["r", "g", "b"]
def _get_ri(self):
return int(self.r * 255)
def _set_ri(self, value)
self.r = float(value) / 255.0
self.ri = property(_get_ri, _set_ri, doc="set/get red as Integer 0-255")
def _get_gi(self):
return int(self.g * 255)
def _set_gi(self, value)
self.g = float(value) / 255.0
self.gi = property(_get_gi, _set_gi, doc="set/get green as Integer 0-255")
def _get_bi(self):
return int(self.b * 255)
def _set_bi(self, value)
self.b = float(value) / 255.0
self.bi = property(_get_bi, _set_bi, doc="set/get blue as Integer 0-255")
def __init__(self, red=0.0, green=0.0, blue=0.0)
if type(red) is float:
self.r = red
else:
self.ri = red
if type(green) is float:
self.g = green
else:
self.gi = green
if type(blue) is float:
self.b = blue
else:
self.bi = blue
def __str__(self):
return "#%02x%02x%02x" % (self.ri, self.gi, self.bi)
color = RGB(0.5, 127, 0)
print color
Wenn gewünscht kann ich dann auch noch auf Statische- und Klassenmethoden eingehen und auch die Verwendung von super etwas beleuchten.
Gruß
Dookie