首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理内部类的属性依赖关系?

如何处理内部类的属性依赖关系?
EN

Stack Overflow用户
提问于 2012-08-13 15:48:08
回答 2查看 62关注 0票数 1

如果您想更改某个属性的类on change中的其他变量,只需为其编写一个property即可。如果你有一个简单的数据类型,那就很好用了。但是,如果您的变量包含像list这样的复杂类型(并不是那么不典型),则无需再次调用variable.setter即可更改内容本身。

是否有任何回调或事件可用于跟踪对类的列表属性的更改?还能做些什么来保持代码的整洁而不破坏类的内部功能呢?

示例:

代码语言:javascript
复制
class Accumulator(object)
  def __init__(self,all_things):
     # :param all_things: a list of stuff of any kind
     self.__all_things = all_things
  @property
  def all_things(self):
     return self.__all_things
  @all_things.setter
  def all_things(self,input):
      self.__all_things = input

跳出框框思考可能是解决之道。当务之急不是保持类结构的活性,而是找到一种工作模式,并允许一个干净的API!

EN

回答 2

Stack Overflow用户

发布于 2012-08-13 16:19:15

您必须使用list的自定义子类来检测更改:

代码语言:javascript
复制
class MyList(list):
    on_change_callback = None

    def _notify(self):
        if self.on_change_callback is not None:
            self.on_change_callback(self)

    def __setitem__(self, index, value):
        super(MyList, self).__setitem__(self, index, value)
        self._notify()

    # Etc, each mutating method needs to be overridden.

您需要覆盖每个变异方法,调用原始方法(通过super()),然后调用self._notify()。有关方法的列表,请参阅Emulating container types部分。

票数 2
EN

Stack Overflow用户

发布于 2012-08-13 16:39:49

为了允许讨论和增加创造力,我想自己提供以下解决方案:

代码语言:javascript
复制
class Accumulator(object):

    def __init__(self,all_things):
       #:param all_things: a sequence or generator of stuff of any kind
       self.__all_things = tuple(all_things)

    @property
    def all_things(self):
        return self.__all_things

    @property
    def all_things(self, all_things):
        self.__all_things = tuple(all_things)

它是干净的,它是只读的,不会出错或被误用。现在,同样的假设也适用于问题的结构:如果你想改变它,你需要重置它。但你不必告诉用户,因为这是他唯一的机会。如果用户仍然想知道为什么,他可以读取希望冗长的类文档字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11930096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档