这个外观代码看起来是个好主意,还是设计中存在固有的缺陷?更重要的是,有没有一个问题,我可能会遇到这个代码在道路上?任何帮助深表感谢。Django:关于模型架构的问题
我试图建立这个,这样我可以有一个支付类作为我的门面,它接受cc数字等,并将贝宝类作为我的实现,以便我可以为该卡充电并存储有关该信息的信息等等。
class MyFacadeClass(models.Model):
account = models.ForeignKey('Account') # Account omitted from example for brevity.
implementation = CharField(max_length=255, choices=IMPL_CHOICES) # IMPL_CHOICES omitted for brevity
some_field = models.CharField(max_length=255)
def __init__(self, *args, **kwargs):
super(MyFacadeClass, self).__init__(*args, **kwargs)
if self.implementation == 'PAYPAL':
from somewhere import MyPayPalImplementationModelClass
self.impl = MyPayPalImplementationModelClass(my_facade_instance=self, some_field=self.some_field, account=self.account)
# Then MyPayPalImplementationModelClass does stuff with PayPal and has its own attributes such as ack, and datetime and fee_amount behind the scenes.
def save(self, force_insert=False, force_update=False)
if self.impl.is_valid():
self.impl.save()
super(MyFacadeClass, self).save(force_insert, force_update)
您能否澄清一下对象引用计数不会变为0,以及这将如何导致循环GC不能及时完成工作。这是否意味着如果我在Facade的self.impl中引用了实现模型,那么在完成使用外观之后,实现模型的mem将不会是GC? – orokusaki 2010-01-06 23:08:50
MyImplemenationClass是一个ORM模型。 – orokusaki 2010-01-06 23:43:31
这取决于MyPaypalImplementation对第一个参数my_facade_instance的作用。如果你在'MyPaypalImplementation .__ init__'内执行'self.my_facade = my_facade_instance',那么当两个对象超出范围时(没有执行手动循环中断),'.my_facade'将指向你的外观实例,门面的'.impl'属性将指向实现。 两者的引用计数都是1.这个循环最终会被gc打破,但我并不是“最终”的粉丝。 – Crast 2010-01-07 00:53:49