是否有某种方法将类实例的属性名称空间导入方法?
此外,是否有人将输出定向到实例的属性名称空间?
例如,考虑这个简单的代码块:
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兼容的答案。
编辑:为清楚起见。
答案 0 :(得分:2)
@ martin-lear正确回答了你问题的第二部分。为了解决第一部分,我将提供以下观察结果:
首先,除了在self上执行属性查找之外,没有语言功能允许您将实例的命名空间“导入”到方法范围中。
您可能会滥用exec
或eval
以及实例的__ 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'
或类似的东西