Ho cercato di capire __new__
e metaprogrammazione. Quindi ho dato un'occhiata al codice sorgente Python ufficiale.__new__ in fractions module
http://hg.python.org/cpython/file/2.7/Lib/fractions.py
La loro funzione __new__
per frazioni assomiglia:
class Fraction(Rational):
def __new__(cls, numerator=0, denominator=None):
"""Constructs a Fraction. ... """
self = super(Fraction, cls).__new__(cls)
...
if isinstance(numerator, float):
# Exact conversion from float
value = Fraction.from_float(numerator)
self._numerator = value._numerator
self._denominator = value._denominator
return self
@classmethod
def from_float(cls, f):
"""Converts a finite float to a rational number, exactly. ..."""
# ...
return cls(*f.as_integer_ratio())
Perché si return self
, piuttosto che
return Fraction.from_float(numerator)
ho pensato ho capito, ma ora sono confuso .
(Edit)
Per sostenere la creazione di sottoclassi, farebbe alcuna differenza per passare alla
return cls.from_float(numerator)
Per la cronaca, il codice sembra funzionare lo stesso con le modifiche suggerite. Non ho ancora provato alcun benchmark, ma non penso che sarebbe più lento restituire direttamente il valore costruito ... – Fraxtil