2013-01-01 20 views
0

當我設計一個Python和代碼簡單的ORM象下面這樣:運行如何設計形式表的別名在Python

Table.id # return "Table.id" 

table = Table() 
table.id # return table.id's value 

class Column(object): 

    def __get__(self, instance, owner): 

     if instance: 
      return self.value 

     return owner.__name__ + "." + self.column_name 

class Table(object): 

    id = Column() 

左右,但我要如何設計一個Alias類這將讓我喜歡運行如下一些代碼:

with Table as T1: 

    T1.id # return "T1.id" 

with ..... as是一個Python聲明。

我不知道如何設計這個別名,並實現這樣的結果,有人可以提供一些想法?

回答

3

with聲明期望context manager,它只是一個帶有__enter____exit__方法的對象。

你的Table類應該有一個__enter__類方法返回一個別名;它的__exit__可能會保持空白。

class Table(object): 
    @classmethod 
    def __enter__(cls): 
     return Alias(cls) 

    @classmethod 
    def __exit__(cls, etype, evalue, tb): 
     pass 

Alias類可能是Table一個子類,或者它可以(用__getattr__或類似沿屬性的訪問傳遞給原來Table)是一個代理。

不能檢測返回值將綁定到什麼名稱,你必須讓你的上下文管理器調用。我建議你創建一個Alias上下文管理器來代替:

with Alias(Table, 'T1') as T1: 
    # work with T1. 
+0

**並沒有與該問題,T1.id是「Table.id」不是我要「T1.id」 ** ** – user1941129

+0

有是一個問題,T1.id是「Table.id」不是我想要的「T1.id」** – user1941129

+0

Martijn Pieters感謝您的建議,我會試一試。 – user1941129