调用子类函数而不是主类函数

问题描述 投票:0回答:1

我尝试用 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 。

python python-3.x oop
1个回答
0
投票

我从问题中不清楚你想要的行为,但你可以使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.