Python "generic"类属性编码/解码

标签 python

我几乎保证这很简单。我正在尝试创建一个通用属性来包装 django 文本/blob 字段。这不是 Django 特有的,它实际上只是一个设计问题。我有一些类级别的变量,并且正在使用伪委托(delegate)来重用解码方法。

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)

问题出在上面两行,我需要传递 self.我尝试过使用该类,但它无法识别。


很简单,上面的问题拉出来就解决了,下面是最终的工作解决方案。

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)

最佳答案

只需从 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

关于Python "generic"类属性编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5791141/

相关文章:

python - 删除 python 中的换行符?

python - 如何比较 Django 模板中的日期

Python NumPy 将 FFT 转换为文件

python 套接字保持 CLOSE_WAIT

python - 在 pySpark 中使用 paramGrid 从 CrossValidator 中提取结果

未找到 Python 方法,但已在类中定义

python - 如何在水平堆叠条形图中构建层次结构标签

python - Pyinstaller 3.4 无法在使用 Python 2.7 的 Windows 10 上运行

python - Cygwin和Windows路径冲突;同时使用 Windows 和 cygwin Python

python - 在 after_all 钩子(Hook)中访问错误消息的方法