【发布时间】:2022-01-15 01:25:59
【问题描述】:
我有一个类可以在二维板上创建块。我定义了它,因此它会根据它们在板上的高度、长度和位置来执行此操作,但还创建了一个替代构造函数,通过在板上传递其坐标来创建块。
class Block:
""" Create a block of given height and length in a starting location."""
def __init__(self, name: str, h: int, l: int, location: Tuple[int,int]):
self.name = name
self.coords = [tuple_sum(t1=location, t2=(i//l , i%l)) for i in range(h*l)]
# tuple_sum does (a, b)+(c, d) -> (a+c, b+d)
@classmethod
def from_coords(cls, name: str, coords: List[Tuple]):
block = cls.__new__(cls)
block.name = name
block.coords = coords
return block
...
def __str__(self) -> str:
return f'Name: {self.name}\nCoords: {self.coords}'
我正在尝试为板上的空白创建一个子类。我认为使用 from_coords 构造函数可以完成所有工作,但由于某种原因,我不明白创建的元素没有初始化,即没有 name 或 coords 属性。
class SpacesBlock(Block):
""" Make a block of spaces from a list of coordenates """
def __init__(self, coords):
super().from_coords(" ",coords)
...
spaces = SpacesBlock([(0,0),(0,1)])
print(spaces)
AttributeError Traceback (most recent call last)
\block.py in <module>
space = SpacesBlock([(0,0),(0,1)])
----> print(spaces)
AttributeError: 'SpacesBlock' object has no attribute 'name'
我以为是 from_coords 构造函数,但它工作正常
a = Block.from_coords("A",[(0,0),(1,0)])
print(a)
Name: A
Coords: [(0, 0), (1, 0)]
我知道我可以在 SpacesBlock 的 init 中定义名称和坐标,一切都很好,但我很好奇为什么它不能像我想象的那样工作。我错过了什么?
【问题讨论】:
标签: python inheritance initialization parent-child