我有一堂課Rational。
class Rational:
def __init__(self, numerator, denominator=1):
self.numerator = numerator
self.denominator = denominator
r1 = Rational(1, 4)
r3 = Rational(r1)
我想要以下列印 True
print(r3 == r1)
我正在為Rational(r1). 這會給我型別Rational.Rational。在嘗試覆寫時__eq__,我嘗試撰寫:
def __eq__(other, x: Rational.Rational)
但這不起作用。如何讓 r3 復制 r1 的值?
我嘗試將init更改為
@dispatch
def __init__(self, x):
self.numerator = x.numerator
self.denominator = x.denominator
但這給了我“TypeError:_() 需要 1 個位置引數,但給出了 3 個”。
這是我目前對eq 的定義:
def __eq__(self, other):
x = False
if self.numerator == other.numerator and self.denominator == other.denominator:
print(f"Self.numerator: {self.numerator} and Self.denominator: {self.denominator}")
x = True
return x
uj5u.com熱心網友回復:
與其嘗試多載Rational.__init__以接受兩個int值或單個值,不如Rational定義一個類方法,該方法將一個Rational值分解為其int組件以創建一個新的Rational.
class Rational:
def __init__(self, numerator, denominator):
self.numerator = numerator
self.denominator = denominator
@classmethod
def from_rational(cls, r: 'Rational'):
return cls(r.numerator, r.denominator)
def __eq__(self, other):
return (self.numerator == other.numerator
and self.denominator == other.denominator)
r1 = Rational(1, 4)
r3 = Rational.from_rational(r1)
您會注意到,使用此定義,Rational(1,2) == Rational(2,4)將回傳False. 我把它作為一個練習來修改Rational.__init__以修改您實際存盤的值以使其__eq__作業。(而不是修改__eq__,您需要存盤有理數的“規范”表示,而不是簡單地存盤引數。)
此定義還假設鴨子型別:您可以成功地將任何值與 anumerator和denominator屬性進行比較Rational。你可能想使定義更強大的(如果other不具備這兩個屬性),以及允許比較喜歡Rational(6,2) == 3來回報True。
uj5u.com熱心網友回復:
from functools import singledispatchmethod
class Rational:
@singledispatchmethod
def __init__(self, numerator):
self.numerator = numerator.numerator
self.denominator = numerator.denominator
@__init__.register
def _(self, numerator:int, denominator=1):
self.numerator = numerator
self.denominator = denominator
def __repr__(self):
return f'Rational({self.numerator}, {self.denominator})'
def __eq__(self, other):
return self.numerator == other.numerator and self.denominator == other.denominator
r1 = Rational(1, 4)
r3 = Rational(r1)
print(r1)
print(r3)
print(r1 == r3)
您可以使用functools.singledispatchmethod上__init__(注意,需要python3.8 )。因為Rational尚未定義,您的默認實作將適用于第一個(也是唯一一個)非 self 引數是 class 的實體的情況Rational,即它具有numeratoranddenominator屬性。然后您可以為int. 現在我把它留給你來實作它str,例如'1/4'。
根據您的定義,只有當它們擁有完全相同的數字時, 的兩個實體Rational才相等,即和不被視為相等,盡管 1/4 == 2/8。Rational(1, 4)Rational(2, 8)
最后,提一下fractionsStandard LIbrary 的模塊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/376524.html
上一篇:我如何修復來自fs.outputJsonSyncnode.js的錯誤
下一篇:訪問嵌套陣列/物件-嵌套物件解構
