Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:通过变量调用类实例_Python_Class_Instances - Fatal编程技术网

python:通过变量调用类实例

python:通过变量调用类实例,python,class,instances,Python,Class,Instances,如何访问名称存储为字符串的类实例 例如: 我有一门课:Feets 还有两个feet实例:RF和LF 在这两个实例中,我需要另一个实例的值。每个实例都知道另一个实例的名称(f.e.LF.contract=“RF”),该实例在创建实例时作为参数提交(f.e.LF=Feets(x,x,x,“RF”) 据我所知,getattr(object,name)不接受字符串作为对象 我提前感谢您的帮助!您可能可以使用类似于 RF = locals()[LF.opposite] 但是,与稍后尝试对另一个实例进行反

如何访问名称存储为字符串的类实例

例如: 我有一门课:Feets 还有两个feet实例:RF和LF

在这两个实例中,我需要另一个实例的值。每个实例都知道另一个实例的名称(f.e.LF.contract=“RF”),该实例在创建实例时作为参数提交(f.e.LF=Feets(x,x,x,“RF”) 据我所知,getattr(object,name)不接受字符串作为对象


我提前感谢您的帮助!

您可能可以使用类似于

RF = locals()[LF.opposite]
但是,与稍后尝试对另一个实例进行反向工程(后者更容易出错)相比,更好的做法是只让这两个实例保存对彼此的引用。您可以通过将
相反属性的设置推迟到创建这两个对象之后进行

class Feets(object):
    def __init__(self):
        self.opposite = None

    def set_opposite(self, other):
        self.opposite = other
        other.opposite = self

LF = Feets()
RF = Feets()
LF.set_opposite(RF)

当然,您可以在任何范围内查找对象。如果对象在全局范围内,您可以使用
globals()[name]
找到它。如果对象在实例或类属性中,您可以使用
getattr(obj_或_class,name)

但是,您可以使用引用或可根据需要创建其他对象的对象,而无需执行查找-这样做的优点是不需要知道在何处查找其他对象。例如:

class FootCreator:
     def __init__(*args, **kwds):
          self.args = args
          self.kwds = kwds

     def other(self, other):
          self.other = other

     def __call__(self):
          try:
              return self.feets
          except:
               pass
          self.feets = Feets(other=self.other, *self.args, self.**kwds)
          return self.feets

class Feets:
     def get_other(self):
          return self.other()
创建后明确设置对另一个对象的引用的解决方案可能是非OO的,因为它可能会破坏不变性(但另一方面,在创建另一个对象之前,对象不会完整)。类似的解决方案是分别创建和初始化对象:

lf = Feets.__new__() # lf created, but not initialized yet
rf = Feets.__new__() # rf created, but not initialized yet
lf.__init__(..., other=rf) # initialize (existing) lf
rf.__init__(..., other=lf) # initialize (existing) rf

为什么不传递实例而不是变量名呢?
LF=Feets(x,x,x,RF)
这两个实例都是单独创建的。LF=Feets(x,x,x,x,RF)RF=Feets(x,x,x,LF)我想在RF尚未创建时我无法传递RF到LF!稍后为第一个对象设置
reversit
属性如何?
LF=Feets(x,x,None);RF=英尺(x,x,x,LF);LF.contract=RF
听起来像是个计划。我会试试。非常感谢!但我相信一定有比交出整个对象更好的方法!你不是在任何地方交出对象,你是在引用它。这比像那样乱搞变量名要好得多。与其直接投反对票,还不如指出at的答案是错误的。现在有两个答案被否决了,没有对它们的错误进行任何评论。