动态惰性类属性python

问题描述 投票:0回答:2

已删除

最小字符数限制为 30..

arrays
2个回答
0
投票

您正在实现描述符协议,并且描述符属于类而不是类的实例,因此您不能将其分配给实例属性。

class Tag(object):
     def __init__(self, tag):
         self.tag = tag
         self.data = None

     def __get__(self, instance, owner):
         if not instance:  # if accessed with the class directly, ie. Record.T1, just return this descriptor
             return self
         if self.data is None:
             print "Reading data"
             self.data = range(10)
         return self.data

 class Record(object):
     T1 = Tag('T1')

0
投票

我有一个似乎有效的解决方案,尽管它很丑陋:

class Record(object):
   def __init__(self, file):
     self._unComputedTags = set() #needs to be initialized first
      #stuff
      self._unComputedTags = set(self._fieldDict.keys())
      for tag in self._fieldDict:
            self.__dict__[tag] = None

   def __getattribute__(self, name):
       if name == '_unComputedTags':
           #This may be unnecessary if I play with things a bit
           return object.__getattribute__(self, '_unComputedTags')
       if name in self._unComputedTags:
           try:
               tagVal = tagToFunc[name](self._fieldDict[name])
           except KeyError:
               tagVal = self._fieldDict[name]
           setattr(self, name, tagVal)
           self._unComputedTags.remove(name)
       return object.__getattribute__(self, name)

我不喜欢覆盖

__getattribute__
但这似乎有效。

© www.soinside.com 2019 - 2024. All rights reserved.