Python 将实例属性从一个模块移动到另一个模块
我遇到了不少麻烦,我相信这是一个很容易解决的问题。尽管如此,我到处都找遍了,却找不到我要找的东西 我有三个模块,module1.py,module2.py,module3.pyPython 将实例属性从一个模块移动到另一个模块,python,class,init,Python,Class,Init,我遇到了不少麻烦,我相信这是一个很容易解决的问题。尽管如此,我到处都找遍了,却找不到我要找的东西 我有三个模块,module1.py,module2.py,module3.py func_that_does_stuff(): return 25 example_func(name, age): name = "rick" age = 30 return name, age 例如,在module1.py中,我有一个初始化类,如下所示: class MyClass
func_that_does_stuff():
return 25
example_func(name, age):
name = "rick"
age = 30
return name, age
例如,在module1.py中,我有一个初始化类,如下所示:
class MyClass():
def __init__(self):
self.name = ''
self.age = 0
from module1 import MyClass
import module3 # this is where i keep my functions that i
# repeatedly use for better code management
me = MyClass()
me.name = "John"
me.age = module3.func_that_does_stuff()
module3.example_func(me.name, me.age) # this function should manipulate the
# name and age lets say it turns john into
# rick, and 25 into 30
在module2.py中,我使用该类创建了一个实例,如下所示:
class MyClass():
def __init__(self):
self.name = ''
self.age = 0
from module1 import MyClass
import module3 # this is where i keep my functions that i
# repeatedly use for better code management
me = MyClass()
me.name = "John"
me.age = module3.func_that_does_stuff()
module3.example_func(me.name, me.age) # this function should manipulate the
# name and age lets say it turns john into
# rick, and 25 into 30
模块3.py
func_that_does_stuff():
return 25
example_func(name, age):
name = "rick"
age = 30
return name, age
正如我上面所说,在模块3中,我有函数,但这里是我遇到问题的地方。我可以将那些对象
(me.name
和me.age
)传递给另一个模块中的函数,但它似乎不会更新me.name
和me.age
所以当我试着在模块2中打印时
print(me.name)
print(me.age)
我得到:
self.name = "John"
self.age = 25
我如何将对象的值传递给另一个模块,按照我认为合适的方式处理它们,并能够更新me
原始实例的self.name
和self.age
希望这是有意义的。以下是
示例\u func
所做的:
def example_func(name, age): # take two arguments
name = "rick" # ignore first argument, assign string literal to name
age = 30 # ignore second argument, assign integer literal to name
return name, age # return new values
module3.example_func(me.name, me.age) # pass two objects (that get ignored)
# and ignore the returned values
以及模块2
的功能:
def example_func(name, age): # take two arguments
name = "rick" # ignore first argument, assign string literal to name
age = 30 # ignore second argument, assign integer literal to name
return name, age # return new values
module3.example_func(me.name, me.age) # pass two objects (that get ignored)
# and ignore the returned values
此不会修改以下内容:
me.name, me.age = module3.example_func(me.name, me.age)
或者,使module3.example_func
将单个MyClass
实例作为参数,并对其进行适当修改:
def example_func(an_instance):
an_instance.name = "rick"
an_instance.age = 30
确实,尽管代码> > ExpRePyFunc 似乎与<>代码> MyClass <代码>相联系,但至少应该考虑将它们放在同一个文件中。如JrrSape中的注释所示,
< P>,问题是您的函数中的直接赋值,它在自己的名称空间中创建新的变量。直接传递me
实例,而不是它的属性(它们是不可变的对象),应该可以解决您的问题
由于您的目的是访问和更改实例属性,请直接将me
实例传递给函数
module3.example_func(me)
然后将函数修改为如下所示,以便直接修改实例属性
example_func(me):
me.name = "rick"
me.age = 30
注意,在直接修改对象时,我们跳过返回的
。在Python中,即使是字符串或整数也是对象。但是,这些对象的行为与继承自类对象的行为不同(请参见)。
例如:
>>> s = "Hello word"
>>> s.foo = 15
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/local00/home/J91272/Bureau/<ipython console> in <module>()
AttributeError: 'str' object has no attribute 'foo'
属性foo包含指向变量的指针。
当我们写入a.foo=36
时,会创建一个新变量,foo的指针在内存中设计新创建的值
将变量a.foo传递给函数不会传递指针,而是传递变量。
当您使用诸如par_a=25
(对于已定义函数func(par_a)
)之类的等式修改此变量时,将创建一个新变量并修改par_a
的指针。
但是a.foo的指针保持不变
如果要按所述传递实例,最好传递整个对象,例如:
example_func(obj):
obj.name = "rick"
obj.age = 30
return obj.name, obj.age
有时我们更喜欢只传递一些特定的参数。
对于从Python调用的非Python函数,它甚至不是必需的。
在这种情况下,我可以建议使用掩码函数,例如:
# Initial function that can not be modified
def example_func(name, age):
name = "rick"
age = 30
return name, age
# Mask function that allows passing the object
def mask_function(obj):
ret = example_func(obj.name, obj.age)
obj.name, obj.age = ret
return ret
我会感兴趣,如果有一个更Pythonic的解决方案 为什么不能传递“me”本身呢?这是因为python中的参数是通过值传递的,而不是通过引用传递的。如果您有一个函数def foo(x):
,则无法更改调用上下文中x
所指的“东西”。我在这个问题中提供的内容非常简单明了。我的实际代码。。它相当长,尤其是处理一些属性的函数。为了我的理智,我想让他们分开,但我感谢他们的帮助@pypy我提出的三个建议中有两个涉及到将它们分开。谢谢你直接回答了!我将使用me实例作为参数。例如,me.name
是不可变的,虽然相关,但在这里不是键-如果它是一个列表
@user3833838,则仍然会发生这种情况。我理解您试图说的内容,但example\u func
不会尝试修改参数,它为这些名字赋予了新的值。你说的“对问题的上下文”是什么意思?我的观点是,在问题具体涉及的代码中,同样的事情也会发生在可变属性上。我得到了纠正,我的答案也得到了纠正。谢谢