将实例名称空间导入方法

时间:2016-04-26 14:14:42

标签: python methods namespaces instance python-import

是否有某种方法将类实例的属性名称空间导入方法?

此外,是否有人将输出定向到实例的属性名称空间?

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

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.的内容,它会使代码更加清晰。如果这是“非常糟糕且永远不应该做”的做法,你能解释一下原因吗?

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

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兼容的答案。

编辑:为清楚起见。

2 个答案:

答案 0 :(得分:2)

@ martin-lear正确回答了你问题的第二部分。为了解决第一部分,我将提供以下观察结果:

首先,除了在self上执行属性查找之外,没有语言功能允许您将实例的命名空间“导入”到方法范围中。

您可能会滥用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 + ....的东西,这表明你缺少一个抽象 - 在这种情况下可能是一个集合 - 你应该设计你的类,你只需要输入{{1 }}

答案 1 :(得分:0)

所以在你的mangle_name函数中,你得到的错误是因为你还没有定义名称变量

self.name = name + '123'

应该是

self.name = self.name + '123'

或类似的东西