Javaからは、継承、抽象クラス、静的メソッド、およびPythonでのOOプログラミングの同様の概念を理解するのに苦労しています。Python 3:super()は予期せずにTypeErrorを発生させます
は私が
# 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)
Leaf
、UnaryOpNode
とBinaryOpNode
のインスタンスで呼び出されたときに正常に動作しますto_expr()
法によって与えられた式ツリークラスの実装を、(簡体字)持っていますが、上で呼び出されたときにTypeError
を上げますVariadicOpNode
のインスタンス:
TypeError: super(type, obj): obj must be an instance or subtype of type
私はsuper()
WOの突然ではないことを、その特定のクラスで間違って何をやっていますrking?
Javaでは、静的メソッドが継承されるので、スーパーコールは必要ありませんが、Pythonではこれは当てはまりません。
Python2または3を使用していますか? https://docs.python.org/2/library/functions.html#super – Jasper
@ジャスパー彼は引数なしで 'super'を使用しているので、彼はpython3.3を使用しています+私は信じています。 – Bakuriu
トピック外:なぜ 'to_expr'で' bracket_complex'を呼び出すために 'super()'を使っていますか? 'self'を使用する必要があります。それ以外の場合、' bracket_complex'をオーバーライドするサブクラスで問題が発生する危険性があります。 –