作为来自Java的开发者,我在学习Python中的继承、抽象类、静态方法以及其他面向对象编程概念时遇到了一些困难。
我已经实现了一个表达式树类,代码如下(简化版)
# Generic node class
class Node(ABC):
@abstractmethod
def to_expr(self):
pass
@staticmethod
def bracket_complex(child):
s = child.to_expr()
return s if isinstance(child, Leaf) or isinstance(child, UnaryOpNode) else "(" + s + ")"
# Leaf class - used for values and variables
class Leaf(Node):
def __init__(self, val):
self.val = val
def to_expr(self):
return str(self.val)
# Unary operator node
class UnaryOpNode(Node):
def __init__(self, op, child):
self.op = op
self.child = child
def to_expr(self):
return str(self.op) + super().bracket_complex(self.child)
# Binary operator node
class BinaryOpNode(Node):
def __init__(self, op, lchild, rchild):
self.op = op
self.lchild = lchild
self.rchild = rchild
def to_expr(self):
return super().bracket_complex(self.lchild) + " " + str(self.op) + " " + super().bracket_complex(self.rchild)
# Variadic operator node (arbitrary number of arguments)
# Assumes commutative operator
class VariadicOpNode(Node):
def __init__(self, op, list_):
self.op = op
self.children = list_
def to_expr(self):
return (" " + str(self.op) + " ").join(super().bracket_complex(child) for child in self.children)
to_expr()
方法适用于 Leaf
、UnaryOpNode
和 BinaryOpNode
的实例,但对于 VariadicOpNode
的实例调用该方法会引发 TypeError
异常:
TypeError: super(type, obj): obj must be an instance or subtype of type
在那门特定的课程中,我做错了什么导致super()
突然失效了?
在Java中,静态方法会被继承,所以我甚至不需要super调用,但在Python中似乎并非如此。
super
,所以我认为他正在使用 Python3.3+。 - Bakuriuto_expr
中使用super()
调用bracket_complex
?你应该使用self
,否则你可能会在覆盖bracket_complex
的子类中引入问题。 - Andrea Corbellini