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

2024-05-18 06:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,如果标题是混淆或误导。我想要的是一种每次使用setter更新变量时更新日志的方法,特别是在不允许更改建议的变量时。一个简单的代码示例最好地解释了我想要什么。这是python3的代码。你知道吗

假设我的程序有一部分输入变量runvars,其中包含变量var1var2。现在从程序上下文来看,var1必须是布尔值。我当前处理这些变量的方法是一个类,它用属性装饰器(在文件中)处理这些变量运行变量.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分配一个字符串时搞砸了,更改被拒绝了。我希望能为var1做同样的事情。你知道吗

我很抱歉,如果出现了实质上类似的东西,我只是有一个困难的时间来制定搜索这个确切的问题。任何建议,包括如何组织这样一个项目的根本性改变,都是受欢迎的。我真的很想通过mySim.runvars.subsec1.var1 = value这样的操作来改变变量,因为输入变量有很多逻辑分组。此外,我希望将runvars之类的类保留在单独的文件中,而不是嵌套,因为否则文件将非常大。也许某种形式的继承在这里会有所帮助,但我只是不明白这样做有什么意义,比如让runvars成为模拟的子类,因为我永远不会单独实例化runvars类。你知道吗


Tags: 文件selfreturndefpropertyvalsettersimulation
1条回答
网友
1楼 · 发布于 2024-05-18 06:12:25

您可以将对错误日志列表的引用传递给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中:

 class simulation:

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

由于列表是作为引用传递的,如果将非布尔值传递给var1,self.__errorLog将相应地更新。你知道吗

相关问题 更多 >