13

存在这样的问题,但没有一个完全像这样,而且我没有找到完全令人满意的答案。

我正在做一个基于代理的生物模型。假设我有一个 A 型细胞和一个 B 型细胞。它们根据时钟老化。假设当 A 型细胞达到一定年龄时,它会变成 B 型细胞。

我有一个细胞清单。我不想只创建新的 B 细胞,然后将它们添加到库存中,然后将 A 细胞留在库存中。

这似乎有效,但它安全吗?

class B(object):
    pass

class A(object):
    def changeToB(self):
        self.__class__ = B

或者,有没有更好的方法?

4

3 回答 3

7

虽然这对口译员来说可能是安全的,但对于试图了解正在发生的事情的人来说绝对是不安全的。

很难找到比生物细胞更自然的对象设计映射,而您正试图丢弃自然存在的东西。细胞具有年龄,并且各种机制根据年龄打开和关闭。在这个世界上,成骨细胞不会突然消失并取而代之的是骨细胞,而是细胞保持其“身份”,但会根据年龄等状态值表现出不同的行为。

如果我正在编写这样的模型,我当然会在对象模型中考虑类似的因素。

于 2012-07-11T22:09:21.390 回答
3

多年前,我在使用解析器时尝试过。它似乎做了我当时想做的事,所以从语言的角度来看是足够安全的,但现在我年纪大了,也更聪明了,我认为我不会将它用于其他人可能必须维护的代码——我不会从这个角度来看,不认为这是非常“安全”的

于 2012-07-11T22:48:30.347 回答
0

这可能是委派的好地方。在内部,您保留所需的实际对象类型,并在适当时将其切换出来。

class B(object):
    def do_something(self):
        print "I'm a B"

class A(object):
    def do_something(self):
        print "I'm an A"

class AorB(object):
    def __init__(self):
        self.identity = A()

    def changeToB(self):
        self.identity = B()

    def do_something(self):
        self.identity.do_something()
于 2012-07-11T22:21:59.697 回答