2011-04-26 83 views
2

我几乎保证这是简单的。我正在尝试创建一个通用属性来包装Django文本/ blob字段。这不是Django特有的,它只是一个设计问题。我有一些类级别的变量,并使用伪代理来重用解码方法。Python“通用”类属性编码/解码

class DBTable(models.Model): 
    class Meta: 
    db_table="some_table" 

    def set_data(self, data): 
    att = self.__getattribute__(data.__name__) 
    att = base64.encodestring(data) 

    def get_data(self,prop): 
    def func(self): 
     att = self.__getattribute__(prop) 
     return base64.decodestring(att) 
    return func 

    #issue is here, i need to pass self to get_data 
    blob_a = property(get_data("blob_a"), set_data) 
    blob_b = property(get_data('blob_b'), set_data) 

而且问题涉及上述两行,我需要通过自我。我曾尝试过使用该课程,但无法识别。


很简单,上面的问题通过拔出来解决,下面是最终的工作解决方案。

def encode_data(self, data): 
    def func(self,data): 
     self.__setattr__(prop, base64.encodestring(data)) 
    return func 

def decode_data(self,prop): 
    def func(self): 
     att = self.__getattribute__(prop) 
     return base64.decodestring(att) 
    return func 


class DBTable(models.Model): 
    class Meta: 
    db_table="some_table" 

    blob_a = property(decode_data("_blob_a"), encode_data("_blob_a")) 
    blob_b = property(decode_data('_blob_b'), encode_data("_blob_b")) 

    _blob_a = models.TextField(
     db_column='blob_a', 
     blank=True) 
    _blob_b = models.TextField(
     db_column='blob_b', 
     blank=True) 
+0

在你的最终解决方案,是如何'get_data'和'set_data'界定? – unutbu 2011-04-26 14:10:28

+0

我有一个错字,我将它们重命名为编码/解码。然而,它不是最终的但BC我处于一个无限循环,它基本上递归调用setattr。现在就开始工作。 – Nix 2011-04-26 14:14:44

回答

3

只需从get_data删除self,使之类之外的功能。

get_data_factory("blob_a")将返回一个函数,该函数需要self作为参数。这很好。它不必从get_data收到(实际上它不应该收到)该值。

def get_data_factory(prop): 
    def get_data(self): 
     return base64.decodestring(getattr(self,prop)) 
    return get_data 

class DBTable(models.Model): 
    ... 
    blob_a = property(get_data_factory("blob_a"), set_data) 

关于最终的解决方案:我认为有与encode_datadecode_data呼叫签名有问题。也许你的意思是:

def encode_data(prop): 
    def func(self,data): 
     setattr(self,prop, base64.encodestring(data)) 
    return func 

def decode_data(prop): 
    def func(self): 
     return base64.decodestring(getattr(self,prop)) 
    return func 
+0

我是否需要忽略关于需要自我作为第一个参数的“警告”?除了忽略之外,有没有更少的臭味annoation? – Nix 2011-04-26 13:47:26

+0

@Nix:你能显示警告吗?我不知道为什么你应该得到一个。 – unutbu 2011-04-26 13:51:41

+0

我有警告bc我离开班级里的get_data。 – Nix 2011-04-26 13:53:00

1

使用def get_data(prop): - 作为外一个没有作为一个实例方法只执行你的内部函数应该接受self

0

你可以使用拉姆达做到这一点:

blob_a = property(lambda s: s.get_data('blob_a'), lambda s: s.set_data('blob_a')) 
blob_b = property(lambda s: s.get_data('blob_b'), lambda s: s.set_data('blob_b'))