Eénwaardige operatoren zijn operatoren die op een enkel object werken,
dus niet in combinatie met een ander object. Een typisch voorbeeld is
het min-teken (-) dat je voor een getal kunt zetten om het negatief te
maken. Je kunt sommige eenwaardige operatoren overloaden, evenals een
aantal basale functies die op een enkel object werken.
__neg__() implementeert de negatie (-) van een object
__pos__() implementeert een plus-teken (+) voor een object (dit
doet meestal niks)
__invert__() implementeert de bitsgewijze not (\~)
__abs__() implementeert de absolute waarde van een object via de
abs() functie
__int__() implementeert de (naar beneden afgeronde) integer waarde
van een object middels de int() functie; deze moet een integer
retourneren
__float__() implementeert de conversie naar een float van een
object middels de float() functie; deze moet een float retourneren
__round__() implementeert afronding middels de round() functie.
Een optioneel tweede argument kan gegeven worden dat het aantal
decimalen specificeert; er moet een integer of een float
geretourneerd worden
__bytes__() implementeert de representatie van het object als een
byte string. Hierin is de methode gelijkwaardig met de __str__()
methode die in hoofdstuk
211
beschreven werd
class Quaternion:
def __init__( self, a, b, c, d ):
self.a, self.b, self.c, self.d = a, b, c, d
def __repr__( self ):
return "({},{}i,{}j,{}k)".format( self.a, self.b,
self.c, self.d )
def __neg__( self ):
return Quaternion( -self.a, -self.b, -self.c, -self.d )
def __abs__( self ):
return Quaternion( abs( self.a ), abs( self.b ),
abs( self.c ), abs( self.d ) )
def __bytes__( self ):
return self.__str__().encode( "utf-8" )
c1 = Quaternion( 3, -4, 5, -6 )
print( c1 )
print( -c1 )
print( abs( c1 ) )
print( bytes( c1 ) )
Opmerking
Het lijkt op het eerste gezicht handig om in de code hierboven ook de
__int__(),__float__(), en__round__()methodes te implementeren, om respectievelijk de functiesint(),float(), enround()toe te passen opself.a,self.b,self.c, enself.d. Helaas werkt dat niet, omdat de betreffende functies integers of floats moeten retourneren, en nietQuaternionen. Ik zie geen zinvolle interpretatie vanint(),float(), enround()voor de classQuaternion, anders dan ik suggereerde, dus deze methodes moeten niet geïmplementeerd worden.