2011-06-19 42 views
2

'm使用代码来管理远程存储上的对象,这意味着我可以创建对象作为从商店读取的结果,或者创建发送到商店的对象创作时间。这里的真正目标是仅当远程存储上的对象表示存在时才创建对象 - 如果远程存储上没有表示,则不会创建对象。classmethod作为自我创建的对象构造函数

class myClass: 
    def __init__(self, parameter1, parameter2) 
    self.param1 = parameter1 
    self.param2 = parameter2 

    @classmethod 
    def create(parameter1, parameter2): 
    if SendToRemoteStore(parameter1, parameter2) == True: 
     return myClass(parameter1, parameter2) 
    else: 
     return None 

    def __del__(): 
    DeleteFromRemoteStore(self) 

# Two ways to create an instance 
# As the result of a remote read: 
data = GetFromRemoteStore() 
object1 = myClass(data['foo'], data['bar']) 

# Or if I'm creating the object here and 
# need to save it to store on creation: 
object2 = myClass.create('baz', 'bar') 
+4

你在这里有什么问题? –

+2

另外:不要依赖'__del__'做任何相关的事情 - 当你完成对象时显式地处理对象,可能会添加一个[上下文管理器](http://www.doughellmann.com/PyMOTW/contextlib/)方便,并在'__del__'中发出警告,如果某些东西没有正常处理。 – delnan

+0

呵呵,我不知何故把问题的一部分留下了问题 - 这真的是“我在做错了吗?” – caw

回答

1

没有必要。

class myClass(object): 
    def __new__(cls, parameter1, parameter2): 
    if SendToRemoteStore(parameter1, parameter2): 
     return super(myClass, cls).__new__(cls) 
    else: 
     return None 

    def __init__(self, parameter1, parameter2): 
    self.param1 = parameter1 
    self.param2 = parameter2 

    def __del__(self): 
    DeleteFromRemoteStore(self) 
+0

'else'子句不是必需的。 – Robin

+1

@Robin:“显式比隐式更好。” –

+1

我不确定从'__new__'返回'None'会做你想做的事。 – doublep

相关问题