Python 将实例属性从一个模块移动到另一个模块

Python 将实例属性从一个模块移动到另一个模块,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

我遇到了不少麻烦,我相信这是一个很容易解决的问题。尽管如此,我到处都找遍了,却找不到我要找的东西

我有三个模块,module1.pymodule2.pymodule3.py

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
    不会尝试修改参数,它为这些名字赋予了新的值。你说的“对问题的上下文”是什么意思?我的观点是,在问题具体涉及的代码中,同样的事情也会发生在可变属性上。我得到了纠正,我的答案也得到了纠正。谢谢