python:按变量调用类实例

时间:2015-08-02 10:03:10

标签: python class instances

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

例如: 我上课:Feets 和Feets的两个实例:RF和LF

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

我事先感谢你的帮助!

2 个答案:

答案 0 :(得分:-1)

你可以用hacky之类的东西来做这件事

RF = locals()[LF.opposite]

然而,更好的做法是让两个实例彼此保持引用,而不是稍后尝试对另一个实例进行反向工程,这更容易出错。您可以通过推迟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)

答案 1 :(得分:-1)

当然,您可以在任何范围内查找对象。如果对象位于全局范围内,则可以使用globals()[name]找到该对象,如果它位于实例或类属性中,则您使用getattr(obj_or_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