如何从嵌套类实例的setter访问类实例信息?

时间:2019-03-04 02:33:01

标签: python

抱歉,标题令人困惑或误导。我想要的是一种在每次使用setter更新变量时都更新日志的方法,尤其是在不允许提议的变量更改时。一个简单的代码示例可以最好地解释我想要什么。这是针对python 3代码的。

比方说,我的程序有一部分输入变量'runvars',其中包含变量var1var2。现在从程序上下文来看,var1必须是布尔值。我当前用于处理这些变量的方法是使用属性装饰器(在runvars.py文件中)处理变量的类:

class runvars:

  def __init__(self,var1=1,var2="obsolete"):
    self.__var1 = var1
    self.__var2 = var2

  @property 
  def var1(self):
    return self.__var1

  @property
  def var2(self):
    return self.__var2

  @var1.setter
  def var1(self,val):
    if isinstance(val,bool):
      self.__var1 = val
    else:
      message = "Type: Setter\nVar.:runvars/var1\nErr.: runvars/var1 must be a boolean."

'runvars'只是许多输入部分之一。我想将其合并为模拟对象的一部分,该模拟对象在诸如“ runvars”和许多其他输入节之类的输入参数之上,还包含模拟元数据。这些数据之一是错误日志。例如:

import runvars

class simulation:

  def __init__(self,var3=True):
    self.__var3     = var3
    self.__errorLog = []
    self.__runvars  = runvars.runvars()

  @property
  def errorLog(self):
    return self.__errorLog

  @property
  def var3(self):
    return self.__var3

  @property
  def runvars(self):
    return self.__runvars

  @var3.setter
  def var3(self,val):
    if isinstance(val,bool):
      self.__var3 = val
    else:
      self.__errorLog.append("Type: Setter\nVar.: simulation/var3\nErr.: simulation/var3 must be a boolean.")

现在如果我跑步

mySim = simulation()
print(mySim.var3)
print(mySim.errorLog)
mySim.var3 = "three"
print(mySim.var3)
print(mySim.errorLog)

我可以看到,我试图将字符串分配给var3时搞砸了,但更改被拒绝。我希望能够对v​​ar1做同样的事情。

很抱歉,如果出现实质性相似的内容,我很难为这个确切的问题制定搜索方法。欢迎提出任何建议,包括对组织此类程序的方式进行重大更改。我真的希望能够通过执行类似mySim.runvars.subsec1.var1 = value的操作来更改变量,因为输入变量有数十种逻辑分组。另外,我想将像runvars之类的类保留在单独的文件中,而不要嵌套,因为否则文件太大。也许某种形式的继承在这里会有所帮助,但是我只是看不到做诸如使runvars为模拟子类之类的事情的意义,因为我将永远不会实例化runvars类。

1 个答案:

答案 0 :(得分:0)

您可以将对错误日志列表的引用传递给"@babel/plugin-transform-runtime": "^7.3.4", "@babel/runtime-corejs2": "^7.3.4", 的实例。

runvars

class runvars: def __init__(self,var1=1,var2="obsolete", errors=[]): self.__var1 = var1 self.__var2 = var2 self.__errors = errors #... @var1.setter def var1(self,val): if isinstance(val,bool): self.__var1 = val else: message = "Type: Setter\nVar.:runvars/var1..." self.__errors.append(message) 中:

simulation

由于列表是作为引用传递的,因此,如果将非布尔值传递给var1, class simulation: def __init__(self,var3=True): self.__var3 = var3 self.__errorLog = [] self.__runvars = runvars.runvars(errors=self.__errorLog) 将相应地更新。