Python中使用子类替换成员对象

2024-06-08 14:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题,我将试图用下面的例子来说明。在

class Brick():
    def __init__(self):
        self.weight = 1

class House():
    def __init__(self, number_bricks):
        self.bricks = [Brick() for i in range(number_bricks)]

    def get_weight(self):
        return reduce(lambda x,y: x+y, [brick.weight for brick in self.bricks])

但是现在假设我创建了一种新的砖,StrongBrick,这样我就生成了一个房子,一个子类StrongHouse,其中StrongBrick在StrongHouse中的作用与Brick在house中的作用完全相同。我怎么就不能在这个类中重新输入定义?在

所以基本思想是,我如何将一个由一些对象组成的类更改为同一个类,但又由原来成员对象的子类组成?在

非常感谢你能给我的任何帮助。在


Tags: 对象inselfnumberforinitdef子类
3条回答

一个不错的模式是:

class Brick(object):
    weight = 1

class StrongBrick(Brick):
    weight = 42

class House(object):
    brick_type = Brick

    def __init__(self, number_bricks):
        self.bricks = [self.brick_type() for i in range(number_bricks)]

    def get_weight(self):
        return reduce(lambda x, y: x + y, [brick.weight for brick in self.bricks])

class StrongHouse(House):
    brick_type = StrongBrick

另一种方法是创建一个工厂函数,并使用默认值为brick_type使用参数:

^{pr2}$

当然,所有这些对象都只是House的实例,尽管我在这里命名了StrongHouse,因此它类似于类名。在

有多种方法可以做到这一点。可以使相关的Brick类成为House类的属性:

class House(object):
    brick_class = Brick

    def __init__(self, number_bricks):
        self.bricks = [self.brick_class() for i in range(number_bricks)]


class StrongHouse(House):
    brick_class = StrongBrick

或者,您可以通过在建造房屋时要使用的Brick类:

^{pr2}$

你可以建个工厂(砖厂?)并将其传递给House.__init__()。在

class Brick(object): pass

class StrongBrick(Brick): pass

class House(object):
    def __init__(self, brick_factory, num_bricks):
        self.bricks = [brick_factory() for i in range(num_bricks)]

house = House(Brick, 10000)
strong_house = House(StrongBrick, 10000)

如您所见,子类化House甚至不需要使用不同类型的砖来建造房屋。在

相关问题 更多 >