Python __float__ Method
Last modified April 8, 2025
This comprehensive guide explores Python's __float__ method, the
special method responsible for converting objects to floating-point numbers.
Basic Definitions
The __float__ method is a special method that defines how an object
should be converted to a float. It is called by the built-in float()
function when converting an object.
Key characteristics: it must return a floating-point number, is automatically invoked during float conversion, and enables custom objects to support float operations. It's part of Python's numeric protocol.
Basic __float__ Implementation
Here's a simple implementation showing how __float__ works with
a custom class. The method returns the float representation of the object.
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
def __float__(self):
return float(self.celsius)
temp = Temperature(23.5)
print(float(temp)) # 23.5
This example shows a Temperature class that stores temperature in Celsius.
The __float__ method returns the stored value as a float.
When float(temp) is called, Python automatically invokes
temp.__float__() to get the float representation. This enables
custom objects to work with float operations.
Converting Custom Objects to Float
__float__ allows custom objects to define their own conversion
logic to floating-point numbers, enabling integration with numeric operations.
class Fraction:
def __init__(self, numerator, denominator):
self.numerator = numerator
self.denominator = denominator
def __float__(self):
return self.numerator / self.denominator
half = Fraction(1, 2)
print(float(half)) # 0.5
quarter = Fraction(1, 4)
print(float(quarter) * 100) # 25.0
This Fraction class implements __float__ to return the decimal
value of the fraction. The conversion enables float operations like
multiplication.
The method performs the division when converting to float, providing the most natural float representation for a fraction object.
Handling Non-Numeric Values
__float__ can include logic to handle cases where conversion to
float isn't straightforward or requires special processing.
class Measurement:
def __init__(self, value, unit):
self.value = value
self.unit = unit
def __float__(self):
if self.unit == 'km':
return float(self.value * 1000)
elif self.unit == 'cm':
return float(self.value / 100)
return float(self.value)
dist1 = Measurement(5, 'km')
dist2 = Measurement(150, 'cm')
print(float(dist1)) # 5000.0
print(float(dist2)) # 1.5
This Measurement class converts different units to meters when converting to
float. The __float__ method handles the unit conversion logic.
The example demonstrates how __float__ can encapsulate conversion
rules, making the object more flexible when used in numeric contexts.
Error Handling in __float__
The __float__ method should handle cases where conversion isn't
possible by raising appropriate exceptions, similar to built-in types.
class Percentage:
def __init__(self, value):
self.value = value
def __float__(self):
try:
return float(self.value.strip('%')) / 100
except AttributeError:
return float(self.value) / 100
except (ValueError, TypeError):
raise ValueError(f"Cannot convert {self.value} to percentage")
p1 = Percentage('50%')
p2 = Percentage(0.75)
print(float(p1)) # 0.5
print(float(p2)) # 0.75
# p3 = Percentage('invalid')
# float(p3) # Raises ValueError
This Percentage class handles string percentages (with '%' sign) and numeric
values. Invalid values raise ValueError, matching Python's
convention.
The error handling makes the conversion robust while maintaining clear error messages when conversion fails, similar to built-in types.
Combining __float__ with Other Numeric Methods
__float__ often works with other numeric special methods to
provide complete numeric behavior for custom objects.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __float__(self):
return (self.x**2 + self.y**2)**0.5
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(3, 4)
v2 = Vector(6, 8)
print(float(v1)) # 5.0 (magnitude)
print(float(v1 + v2)) # 15.0
This Vector class implements __float__ to return the vector's
magnitude, while also supporting vector addition through __add__.
The example shows how __float__ can provide a meaningful numeric
representation while other methods handle different operations, creating a
complete numeric type.
Best Practices
- Return a float: Always return a floating-point number
- Handle errors: Raise appropriate exceptions for invalid conversions
- Keep it simple: Focus on conversion logic only
- Document behavior: Clearly document what the conversion represents
- Consider rounding: Handle floating-point precision appropriately
Source References
Author
List all Python tutorials.