我正在尝试从ClassB
的实例访问Base
类的实例属性(inst_baseA / inst_baseB
),具体取决于对象ClassB的实例属性(self.x
)。你知道吗
这是我的密码:
class Base(object):
def __init__(self):
self.inst_baseA = 'base_B'
self.inst_baseB = 'base_A'
class ClassA(object):
def __init__(self):
self.node = Base()
class ClassB(ClassA):
def __init__(self):
super(ClassB, self).__init__()
self.x = 'base_A'
这是我首先尝试的:
>>> b = ClassB()
>>> getattr(b, 'node.inst_{}'.format(b.x))
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
getattr(b, 'node.inst_{}'.format(b.x))
AttributeError: 'ClassB' object has no attribute 'node.inst_base_A'
如果我链接对getattr的调用,我就克服了这个问题:
>>> getattr(getattr(b, 'node'), b.x)
'base_A'
出于好奇:除了对getattr
进行两次调用之外,还有没有其他方法可以从孙子类中获取基类的属性?你知道吗
更新:我之所以需要它是因为我想: -获取祖父母类(inst\u baseA或inst\u baseB)的属性 -取决于实例上的属性(x的值)
所以我的代码实际上是这样的:getattr(self, 'node.{}'.format(self.x))
。我第一次解释的不对,希望现在能讲得通。你知道吗
根据[Python]: getattr(object, name[, default]):
node.inst_base
不是b
的属性,而是:node
是b
的属性inst_base
是b.node
的属性因此,每个“嵌套”级别需要一个
getattr
调用。你知道吗考虑到我已将您的代码粘贴到解释器的交互窗口中:
或者,为了更进一步,您可以创建一个使用“嵌套”属性名的getter:
但这可能是非常低效的(而且,也不能处理极端情况),你最好使用@aranfey的建议。你知道吗
有^{} ,但它实际上并不适用于这种类型的东西,因此语法非常笨拙:
但这确实非常不直观,因此为了避免让阅读您代码的人感到困惑,最好使用自己的multi-getattr:
相关问题 更多 >
编程相关推荐