gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:05:42 24 4
gpt4 key购买 nike

我几乎可以保证这很简单。我正在尝试创建一个通用属性来包装 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.我已尝试使用该类(class),但无法识别。


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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com