繁体   English   中英

python:通过变量调用类实例

[英]python: call class instance by variable

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

例如:我有一个类:Feets和Feets的两个实例:RF和LF

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

预先感谢您的帮助!

您可能可以通过类似这样的技巧来做到这一点

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)

您当然可以在任何范围内查找对象。 如果对象在全局范围内,则可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM