【问题标题】:Importing instance namespace into a method将实例命名空间导入方法
【发布时间】:2016-04-26 14:14:42
【问题描述】:

有没有办法将类实例的属性命名空间导入到方法中?

另外,有没有办法直接输出到实例的属性命名空间?

例如,考虑这个简单的代码块:

class Name(): 
    def __init__(self,name='Joe'):
        self.name = name

    def mangle_name(self):
        # Magical python command like 'import self' goes here (I guess)
        self.name = name + '123' # As expected, error here as 'name' is not defined

a_name = Name()
a_name.mangle_name()
print(a_name.name)

正如预期的那样,此代码块失败,因为name 未被识别。我想要实现的是方法mangle_name 搜索self 的属性命名空间以查找name(因此在示例中找到'Joe')。是否有一些命令可以导入self的属性命名空间,这样就不会出错,输出是:

>>> Joe123

我知道这可能是不好的做法,但在某些情况下,它会使代码更清晰,而无需大量引用 self.something。如果这是“如此糟糕且永远不应该做”的做法,您能解释一下原因吗?

关于问题的第二部分,我想做的是:

class Name(): 
    def __init__(self,name='Joe'):
        self.name = name

    def mangle_name(self):
        # Magical python command like 'import self' goes here (I guess)
        name = name + '123' # This line is different

a_name = Name()
a_name.mangle_name()
print(a_name.name)

此代码返回输出的位置:

>>> Joe123

尝试命令import self 会返回一个找不到模块的错误。

我使用的是 Python 3.5,因此更喜欢 Python 3.5 兼容的答案。

编辑:为了清楚起见。

【问题讨论】:

    标签: python methods namespaces instance python-import


    【解决方案1】:

    @martin-lear 已正确回答了您问题的第二部分。为了解决第一部分,我将提供以下意见:

    首先,除了对自身执行属性查找之外,没有语言功能可以让您将实例的命名空间“导入”到方法范围内。

    您可能会滥用execeval 和实例的__ dict __ 来获得您想要的东西,但是您必须在方法的开头手动将实例命名空间转储到方法范围中,并且然后在最后更新实例的__dict __

    即使可以做到这一点,也应该避免。源代码主要是人类之间的一种交流方式,如果您的代码以这种方式违反了读者的期望,它将更难以理解和阅读,并且随着时间的推移,这样做的成本将超过您必须输入的成本self 在实例变量名前面。你应该code as if the future maintainers are psychopaths who know where you live的原则在这里适用。

    最后,考虑到不得不大量输入 self 的恼怒告诉了你一些关于你的设计的东西。也许必须输入self.a + self.b + self.c + self.d + self.e + self.f + self.g + self.h + .... 之类的内容表明您缺少抽象——在这种情况下可能是一个集合——并且您应该以只需要输入sum(self.foos) 的方式设计您的类。

    【讨论】:

      【解决方案2】:

      所以在你的 mangle_name 函数中,你得到了错误,因为你没有定义 name 变量

      self.name = name + '123'
      

      应该是

      self.name = self.name + '123'
      

      或类似的东西

      【讨论】:

      • 是的,我意识到这一点。我的问题是关于导入实例的命名空间,以便示例中的行被视为有效代码。
      • 您不需要导入 self,一旦您对其进行更改,代码就会运行良好。您的类函数已经可以访问类属性。
      • 这个问题不是关于如何使示例尽可能简单地工作 - 问题是关于如何导入实例的属性命名空间。在某些情况下,它会使代码更清晰,而无需大量引用 self.something 。
      • 我想我很困惑你为什么要这样做?你不需要导入任何东西,它已经在那里了。如果您愿意,可以将 name 变量分配给 self.name... 但这是多余的。您还可以将变量传递给函数吗?函数 mangle_name(self, name) 然后像 a_name.mangle_name(a_name.name) 一样调用它......但这真的很混乱......
      • 因为 a + b + c + d + e + f + g + h + ... 比 self.a + self.b + self.c + self.d + self 清晰很多.e + self.f + self.g + self.h + .... 此外,它可以潜在地节省您必须更改已知在将某些脚本制作为类的过程中正在工作的代码。
      猜你喜欢
      • 2018-01-05
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2016-12-03
      • 1970-01-01
      相关资源
      最近更新 更多