Xuất phát từ Java, tôi đang gặp khó khăn trong việc nhận thừa kế, lớp trừu tượng, phương thức tĩnh và khái niệm tương tự về lập trình OO bằng Python.Python 3: super() tăng TypeError bất ngờ
Tôi có một thực hiện của một lớp cây biểu thức, nhất định (giản thể) bởi
# 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)
Phương pháp to_expr()
hoạt động tốt khi kêu gọi các trường hợp Leaf
, UnaryOpNode
và BinaryOpNode
, nhưng đặt ra một TypeError
khi kêu gọi một thể hiện của VariadicOpNode
:
TypeError: super(type, obj): obj must be an instance or subtype of type
tôi đang làm gì sai ở chỗ lớp cụ thể mà super()
là đột nhiên không wo rking?
Trong Java, phương pháp tĩnh sẽ được kế thừa vì vậy tôi thậm chí sẽ không cần cuộc gọi siêu, nhưng trong Python, điều này có vẻ không phải như vậy.
bạn đang sử dụng Python2 hay 3? https://docs.python.org/2/library/functions.html#super – Jasper
@Jasper Vì anh ấy đang sử dụng 'super' mà không có đối số, anh ta đang sử dụng python3.3 + Tôi tin. – Bakuriu
Tắt chủ đề: tại sao bạn sử dụng 'super()' trong 'to_expr' để gọi' bracket_complex'? Bạn nên sử dụng 'self', nếu không bạn có nguy cơ giới thiệu các vấn đề trong các lớp con ghi đè' bracket_complex' –