Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将实例命名空间导入到方法中_Python_Methods_Namespaces_Instance_Python Import - Fatal编程技术网

Python 将实例命名空间导入到方法中

Python 将实例命名空间导入到方法中,python,methods,namespaces,instance,python-import,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.

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

另外,是否有方法将输出定向到实例的属性命名空间

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

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\u 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
返回模块未找到错误

我使用的是Python3.5,因此更喜欢与Python3.5兼容的答案


编辑:为了清楚起见。

因此,在mangle_name函数中,您会得到错误,因为您没有定义name变量

self.name = name + '123'
应该是

self.name = self.name + '123'

或者类似的

因此,在mangle_name函数中,由于没有定义name变量,因此出现了错误

self.name = name + '123'
应该是

self.name = self.name + '123'

或者类似的东西

@马丁·李尔正确地回答了你问题的第二部分。为了解决第一部分,我将提供以下观察结果:

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

您可能会滥用
exec
eval
和实例的
dict
来获得您想要的内容,但是您必须在方法开始时手动将实例命名空间转储到方法范围中,然后在结束时更新实例的
\udict

即使可以做到这一点,也应该避免。源代码主要是人与人之间通信的一种方式,如果您的代码以这种方式违反了读者的期望,那么理解和阅读就会更加困难,而且随着时间的推移,这样做的成本将超过您必须在实例变量名前键入self的成本。你应该在这里应用的原则


最后,考虑到不得不自我打量的恼怒是告诉你一些关于你的设计的事情。也许必须键入类似于
self.a+self.b+self.c+self.d+self.e+self.f+self.g+self.h+..
的内容是一种迹象,表明您缺少了一个抽象(在本例中可能是一个集合),您应该以这样的方式设计类,即只需键入
sum(self.foos)

@马丁·李尔正确回答了你问题的第二部分。为了解决第一部分,我将提供以下观察结果:

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

您可能会滥用
exec
eval
和实例的
dict
来获得您想要的内容,但是您必须在方法开始时手动将实例命名空间转储到方法范围中,然后在结束时更新实例的
\udict

即使可以做到这一点,也应该避免。源代码主要是人与人之间通信的一种方式,如果您的代码以这种方式违反了读者的期望,那么理解和阅读就会更加困难,而且随着时间的推移,这样做的成本将超过您必须在实例变量名前键入self的成本。你应该在这里应用的原则


最后,考虑到不得不自我打量的恼怒是告诉你一些关于你的设计的事情。也许必须键入类似于
self.a+self.b+self.c+self.d+self.e+self.f+self.g+self.h+..
的内容是一种迹象,表明您缺少了一个抽象(在本例中可能是一个集合),您应该以这样的方式设计类,即只需键入
sum(self.foos)

是的,我知道。我的问题是导入实例的名称空间,以便将示例中的行视为有效代码。您不需要导入self,只要对其进行更改,代码就可以正常运行。您的类函数已经可以访问class属性。这个问题不是关于如何使示例尽可能简单地工作,而是关于如何导入实例的属性命名空间。在某些情况下,如果代码中没有大量的self.something引用,它会使代码更加清晰。我想我很困惑你为什么要这么做?你不需要导入任何东西,它已经存在了。如果愿意,可以将name变量分配给self.name。。。但这是多余的。您还可以将变量传递给函数?函数mangle_name(self,name),然后像_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+self。。。。此外,它还可以潜在地节省您在将某些脚本生成类的过程中修改代码的时间。是的,我意识到这一点。我的问题是导入实例的名称空间,以便将示例中的行视为有效代码