从不同的fi更改对象的变量

2024-09-28 17:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从不同文件中定义的函数访问对象(特别是它的变量)。我们来看一个例子:

文件1-grail.py

import enemies

class Encounter:
    def __init__(self):
        self.counter = 1
        self.number = 0
        self.who = "We've encountered no one."

    def forward(self):
        if self.counter == 1:
            enemies.knightofni()
        elif self.counter == 2:
            enemies.frenchman()
        else:
            self.number = 42
            self.who = "We've found the Grail!"
        self.counter += 1

knight = Encounter()
for i in range(4):
    print(str(knight.number) + " " + knight.who)
    knight.forward()

文件2-enemies.py(我可能需要这个文件中的某些内容)

def knightofni():
    Object.number = 1
    Object.who = "We've encountered Knight of Ni."

def frenchman():
    Object.number = 4
    Object.who = "We've encountered French."

输出应显示:

0 We've encountered no one.
1 We've encountered Knight of Ni.
4 We've encountered French.
42 We've found the Grail!

我知道您可以通过从文件enemies.py中的函数返回一些内容来实现输出,例如函数frenchman()可以如下所示:

def frenchman():
    return [4, "We've encountered French."]

grail.py中,我应该更改代码以收集frenchman()返回的内容:

...
        elif self.counter == 2:
            spam = enemies.frenchman()
            self.number = spam[0]
            self.who = spam[1]
...

但是它使用额外的资源,使代码更长,在更复杂的情况下更麻烦。你知道吗

有没有一种方法可以直接对对象的变量执行任务,但将函数保存在单独的文件中?你知道吗

编辑 这个问题已经有了答案,但也许我会在其中一个答案中添加澄清(引用对这个答案的评论):

I want it to be possible to add other "enemies" without making lengthy code in this place (so forward() is kind of a wrapper, place where it is decided what to do in different situations). It is also more readable if this functions are in different file.

Think of situation where there would be 100 "enemies" and each would need to change 100 variables which are lists with 1M entries each. Is there a better way than putting "enemies" into other file and changing variables directly in the file?


Tags: 文件函数inpyselfnumberdefcounter
2条回答

问题

你需要把这个对象作为论据交出来。你知道吗

在函数中:

def knightofni(obj):
    obj.number = 1
    obj.who = "We've encountered Knight of Ni."

在课堂上使用时:

enemies.knightofni(self)

frenchman()执行相同的操作。你知道吗

完整代码

grail.py

import enemies

class Encounter:
    def __init__(self):
        self.counter = 1
        self.number = 0
        self.who = "We've encountered no one."

    def forward(self):
        if self.counter == 1:
            enemies.knightofni(self)
        elif self.counter == 2:
            enemies.frenchman(self)
        else:
            self.number = 42
            self.who = "We've found the Grail!"
        self.counter += 1

knight = Encounter()
for i in range(4):
    print(str(knight.number) + " " + knight.who)
    knight.forward()

enemies.py

def knightofni(obj):
    obj.number = 1
    obj.who = "We've encountered Knight of Ni."

def frenchman(obj):
    obj.number = 4
    obj.who = "We've encountered French."

输出:

0 We've encountered no one.
1 We've encountered Knight of Ni.
4 We've encountered French.
42 We've found the Grail!

这是可能的,尽管我不知道你为什么真的想这样做。你知道吗

forward__init__方法中,您会注意到您正在传递self,这是您正在操作的Encounter的实例。这就是为什么您可以执行self.number = 42并在调用knight.number时获得正确的号码。你知道吗

因为self只是一个对象,所以您可以将它传递到'敌人.py'. 你知道吗

尝试:

# grail.py
def forward(self):
    if self.counter == 1:
        enemies.knightofni(self)
    elif self.counter == 2:
        enemies.frenchman(self)
    else:
        self.number = 42
        self.who = "We've found the Grail!"
    self.counter += 1

#enemies.py
def knightofni(that):
    that.number = 1
    that.who = "We've encountered Knight of Ni."

def frenchman(that):
    that.number = 4
    that.who = "We've encountered French."

相关问题 更多 >