Python类和类型

时间:2018-06-03 12:18:39

标签: python class subclass

我认为我滥用了子类的概念。我正在与Grids and Cells合作开展业余爱好项目。

我所拥有的是<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <button type="button" class="btn btn-primary custom">Primary</button>类及其子类SELECT TOP(1) ProductName, ProductPrice FROM tblProducts ORDER BY ProductPrice DESC; 的实现,它基本上重新定义了许多属性/方法,如下所示:

Cell

然后我有一个HexCell的子类,它跟随一个带有新参数的类似结构。

class Cell: 

  def __init__(self, row_loc, col_loc):
    self.row = row_loc
    self.col = col_loc
    self.links = set()
    self.neighbors = 4*[None]

  def __repr__(self):
    return f'Cell @({self.row},{self.col})'

  def link(self, other, bidir = True):
    self.links.add(other)
    if bidir: other.links.add(self)

在这种情况下,方法HexGrid是共享的,但其他属性从矩形网格变为六边形,如class HexCell(Cell): def __init__(self, r_out, th_around): # I'm indexing Hex cells around a center cell # instead of by rows and columns; Prefixed hex # as they follow the hexagon, and not regular polar coordinates. self.hex_r = r_out self.hex_th = th_around self.neighbors = 6*[None] self.links = set() def __repr__(self): return f"HexCell @[{self.hex_r}, {self.hex_th}]" def bind(self, other, to_dir): to_dir = to_dir % 6 if (self.neighbors[to_dir] is None): self.neighbors[to_dir] = other other.neighbors[to_dir - 3] = self # Hexagonal grids share neighbors. other_1 = other.neighbors[to_dir - 2] if (self.neighbors[to_dir - 1] is None) & (other_1 is not None): self.bind(other_1, to_dir - 1) other_5 = other.neighbors[to_dir - 4] if (self.neighbors[to_dir - 5] is None) & (other_5 is not None): self.bind(other_5, to_dir - 5) self.link(other)的位置,或(row, col) 4个列表或6个列表。因此,我希望这些属性依赖于另一个单元格类型属性并传递给子类。

2 个答案:

答案 0 :(得分:3)

正确使用子类需要遵守以下替换原则:

  

如果x_1类型的T_1和类型x_2的{​​{1}}类似T_2,那么适用于{{1}的任何属性}}也必须申请issubclass(T_2, T_1) == True

换句话说,您希望子类化实现行为,而不是更改现有行为。

在您的示例中,坐标系本身的更改是行为的更改,因此x_1不应从x_2继承。

您可以做的是创建一个基类HexCell,它封装了CellBaseCell之间的共同行为,并从中继承。

Cell

答案 1 :(得分:1)

你的Cell类实际上不是一个抽象的&#34; Cell&#34;,而是二维空间中的正方形单元格(正好有4个邻居,有&#34;行&#34;和&#34; col&#34; position)。这样的细胞可能不被六角形细胞亚类化,因为六角形细胞只是一种不同类型的细胞:)

正如您所注意到的,唯一常见的事情是link()方法和链接属性。如果你坚持继承子类,你可以创建类似的东西:

class LinkedObject():
    def __init__(self):
        self.links = set()

    def link(self, other, bidir = True):
        self.links.add(other)
        if bidir: other.links.add(self)

class SquareCell(LinkedObject):
    # "Cell" class here

class HexCell(LinkedObject):
    # HexCell here