Java'dan geliyorum, Python'da devralma, soyut sınıflar, statik yöntemler ve benzer OO programlama kavramları ile ilgili olarak biraz uğraşıyorum.Python 3: super() TypeError'ı beklenmedik bir şekilde yükseltir
Ben
# 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
ve BinaryOpNode
olaylarına aradığında çalışıyor to_expr()
yöntem tarafından verilen bir ifade ağaç sınıfının bir uygulama, (basitleştirilmiş), ancak bir çağrıda zaman TypeError
yükseltir VariadicOpNode
örneği:
TypeError: super(type, obj): obj must be an instance or subtype of type
Ben super()
wo aniden olmadığını bu özel sınıfta yanlış yapıyorum rking?
Java'da statik yöntem devralınırdı, böylece süper aramaya bile ihtiyacım yoktu, ancak Python'da durum böyle görünmüyor.
Python2 veya 3 kullanıyor musunuz? https://docs.python.org/2/library/functions.html#super – Jasper
@Jasper O argümanlar olmadan "süper" kullandığı için python3.3 + kullanıyor. – Bakuriu
Konu dışı: neden 'bracket_complex' işlevini çağırmak için 'super_' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'nı neden kullanıyorsunuz? 'Self' kullanıyor olmalısınız, aksi takdirde alt sınıflardaki problemleri tanıtma konusunda risk alıyorsunuz 'bracket_complex' –