運算式是這樣給出的:
e = Plus(Plus(Const(3),Const(4)),Const(5))
如果我 print(e) 它應該給我:
print(e)
(3 4) 5
我的代碼是這樣的,我的邏輯是 prec 的父類值為 0,因此當類評估內部 Plus 時,它應該引入 '( )',如 if-statment 所示。請更正我的代碼。我是這里的初學者。
class Expr:
prec=0
def __str__(self):
if self.prec>prec:
return "(" str(self.l) self.op str(self.r) ")"
else:
return str(self.l) self.op str(self.r)
class Plus(Expr) :
op=' '
prec=1
def __init__(self,l,r) :
self.l = l
self.r = r
class Const(Expr) :
def __init__(self,v) :
self.v = v
def __str__(self):
return str(self.v)
e = Plus(Plus(Const(3),Const(4)),Const(5))
print(e)
#(3 4) 5
uj5u.com熱心網友回復:
看起來prec應該是傳遞給__str__函式的引數。
class Expr:
def __init__(self):
self.prec = 0
self.nb_operands = 0
def __str__(self, prec=0):
if self.nb_operands == 0:
return str(self.v)
elif self.nb_operands == 1:
return self.op self.v.__str__(self.prec)
elif self.nb_operands == 2:
if self.prec < prec:
return ''.join([
"(",
self.l.__str__(self.prec),
self.op,
self.r.__str__(self.prec),
")"
])
else:
return self.op.join((
self.l.__str__(self.prec),
self.r.__str__(self.prec)
))
class Plus(Expr) :
def __init__(self,l,r) :
self.op = ' '
self.prec = 1
self.nb_operands = 2
self.l = l
self.r = r
class Times(Expr) :
def __init__(self,l,r) :
self.op = '*'
self.prec = 2
self.nb_operands = 2
self.l = l
self.r = r
class Minus(Expr) :
def __init__(self,v) :
self.op = '-'
self.prec = 1
self.nb_operands = 1
self.v = v
class Const(Expr) :
def __init__(self,v) :
self.prec = 0
self.v = v
self.nb_operands = 0
測驗:
print( Plus(Plus(Const(3),Const(4)),Const(5)) )
3 4 5
print( Plus(Times(Const(3),Const(4)),Const(5)) )
3*4 5
print( Times(Plus(Const(3),Const(4)),Const(5)) )
(3 4)*5
print( Times(Plus(Const(3),Const(4)),Minus(Const(5))) )
(3 4)*-5
uj5u.com熱心網友回復:
這是對@Stef 出色答案的補充。我想展示一種方法來保持類代碼簡單,同時保持她/他的遞回程序的優雅 -
class Expr:
def __init__(self):
self.prec = 0
self.nb_operands = 0
def __str__(self):
return to_str(self) # keep classes simple
whereto_str定義為普通函式。避免十幾個實體self和手動呼叫以__str__提高可讀性 -
def to_str(e, prec=0):
match e.nb_operands:
case 0:
return str(e.v)
case 1:
return e.op to_str(e.v, e.prec)
case 2:
if e.prec < prec:
return ''.join([
"(",
to_str(e.l, e.prec),
e.op,
to_str(e.r, e.prec),
")"
])
else:
return e.op.join([
to_str(e.l, e.prec),
to_str(e.r, e.prec)
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405742.html
標籤:
上一篇:將多個python字串轉換為物件
下一篇:追加物件而不合并
