Python __pos__ Method
Last modified April 8, 2025
This comprehensive guide explores Python's __pos__
method, the
special method that implements the unary plus operator (+). We'll cover basic
usage, numeric types, custom classes, and practical examples.
Basic Definitions
The __pos__
method is called to implement the unary plus (+)
operation. It should return the result of the operation, typically the object
itself or a modified version.
Key characteristics: it takes only self
as parameter, should return
a value, and is invoked when the unary + operator is used on an instance. It's
part of Python's operator overloading mechanism.
Basic __pos__ Implementation
Here's a simple implementation showing how __pos__
works with a
custom class. The method returns the object itself by default.
class Number: def __init__(self, value): self.value = value def __pos__(self): print("__pos__ called") return self def __repr__(self): return f"Number({self.value})" num = Number(5) +num # Calls __pos__
This example shows the basic structure. The __pos__
method is
called when the unary + operator is used on the instance. Here it just returns
the object itself.
The output would show "__pos__ called" when the + operator is used. This is the most basic implementation possible.
Modifying Value with __pos__
We can make __pos__
actually modify the value before returning it.
This demonstrates how to implement meaningful behavior.
class PositiveNumber: def __init__(self, value): self.value = value def __pos__(self): return PositiveNumber(abs(self.value)) def __repr__(self): return f"PositiveNumber({self.value})" num = PositiveNumber(-5) result = +num print(result) # PositiveNumber(5)
This implementation ensures the number is always positive when the unary + operator is applied. It creates and returns a new instance with the absolute value.
The original instance remains unchanged. This is a common pattern when working with immutable numeric types where operations return new objects.
__pos__ with Mathematical Operations
The __pos__
method can be combined with other mathematical
operations to create more complex behaviors.
class Vector: def __init__(self, x, y): self.x = x self.y = y def __pos__(self): return Vector(+self.x, +self.y) def __neg__(self): return Vector(-self.x, -self.y) def __repr__(self): return f"Vector({self.x}, {self.y})" v = Vector(2, -3) print(+v) # Vector(2, -3) print(-v) # Vector(-2, 3)
This Vector class implements both __pos__
and __neg__
.
The positive version returns a new vector with components unchanged, while the
negative version inverts them.
This shows how unary operators can work together to provide complete mathematical operations for custom classes.
__pos__ with Inheritance
When inheriting from built-in types, __pos__
can be overridden to
modify the default behavior of the unary + operator.
class MyInt(int): def __pos__(self): print("Custom __pos__ called") return MyInt(super().__pos__() + 1) num = MyInt(5) result = +num print(result) # 6
This custom integer class increments the value by 1 when the unary + operator is applied. It demonstrates how to extend built-in type behavior.
The method calls the parent class's __pos__
using super()
,
then adds 1 to the result. This pattern is useful for modifying existing numeric
behaviors.
Practical Use Case: Currency Class
Here's a practical example using __pos__
in a financial application
to ensure positive currency values.
class Currency: def __init__(self, amount): self.amount = amount def __pos__(self): return Currency(abs(self.amount)) def __repr__(self): return f"${self.amount:.2f}" debt = Currency(-100.50) positive_debt = +debt print(positive_debt) # $100.50
This Currency class uses __pos__
to convert negative amounts to
positive values. This could represent converting debt to a positive display
value.
Financial applications often need such transformations when displaying values while preserving the original data for calculations.
Best Practices
- Maintain consistency: +x should generally not change x's value
- Return new objects: For immutable types, return a new instance
- Preserve type: Return the same type as the operand
- Document behavior: Clearly document any special behavior
- Combine with __neg__: Often implemented together
Source References
Author
List all Python tutorials.