我尝试用 Python 学习面向对象编程,但总是遇到 TypeError。
这是我的完整代码:
class Graph():
def __init__(self):
self.num_vertices = 0
self.num_edges = 0
self.vertices = {}
def __iter__(self):
return iter(self.vertices.values())
def __str__(self) -> str:
return f'Graph with {self.num_vertices} vertices and {self.num_edges} edges.'
def add_vertices(self, vertex_names):
for vertex_name in vertex_names:
if vertex_name not in self.vertices.keys():
self.vertices.update({vertex_name: Vertex(vertex_name)})
self.num_vertices += 1
def add_edge(self, vertex_name1, vertex_name2):
if vertex_name1 != vertex_name2 and vertex_name1 not in self.vertices[vertex_name2].neighbors:
if vertex_name1 or vertex_name2 not in self.vertices.keys():
self.add_vertices([vertex_name1, vertex_name2])
self.num_edges += 1
self.vertices[vertex_name1].add_neighbor(self.vertices[vertex_name2])
self.vertices[vertex_name2].add_neighbor(self.vertices[vertex_name1])
def get_max_degree(self):
degrees = []
for vertex in self.vertices.values():
degrees.append(len(vertex.neighbors))
return max(degrees)
class Bipartite_Graph(Graph):
def __init__(self) -> None:
self.partA = []
self.partB = []
super().__init__()
def __str__(self) -> str:
return f'Bipartite graph with {len(self.partA)} vertices in A, {len(self.partB)} vertices in B and {self.num_edges} edges.'
def add_vertices(self, vertex_names, partition):
for vertex in vertex_names:
if partition == 'A':
self.partA.append(vertex)
super().add_vertices([vertex])
else:
self.partB.append(vertex)
super().add_vertices([vertex])
def add_edge(self, vertex_nameA, vertex_nameB):
if vertex_nameA not in self.partB and vertex_nameB not in self.partA:
super().add_edge(vertex_nameA, vertex_nameB)
当我使用时:
B = Bipartite_Graph()
B.add_vertices(['a1','a2'],'A')
B.add_vertices(['b1'],'B')
B.add_edge('a1','b1')
然后我得到 TypeError:
line 36, in add_edge
self.add_vertices([vertex_name1, vertex_name2])
TypeError: Bipartite_Graph.add_vertices() missing 1 required positional argument: 'partition'
问题是,总是调用子类的 add_vertices 而不是主类中的 add_vertices 。
我从问题中不清楚你想要的行为,但你可以使用
super()
调用它继承的类的方法
例如
class Foo(Bar):
def __init__(self):
super().__init__() # calls Bar's __init__()
# now do more with Foo
如果你想通过方法调用创建一个类的新实例,你可以使用
@classmethod
例如
(修改自https://stackoverflow.com/a/12179752/4541045)
class Date:
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
def __repr__(self):
return f"{type(self).__name__}({self.year}-{self.month}-{self.day})"
@classmethod
def from_string(cls, date):
year, month, day = map(int, date.split('-'))
date = cls(day, month, year)
return date
>>> Date.from_string("2024-02-01")
Date(2024-2-1)