我有一個包含不同類和函式的模塊(一個 python 檔案),這里稱為“Experiment_1”。當它作為主檔案運行時,所有物件都可以訪問所有變數——object_2函式可以訪問object_1中的變數,依此類推:
# Experiment_1
class A():
def process1(self):
self.x=10
def process2(self):
self.y=20
class B():
def addition(self):
summed=object_1.x object_1.y
print(summed)
if __name__ == '__main__':
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
接下來,我嘗試在檔案“Experiment_2”中將其作為匯入模塊運行:
# Experiment_2
from Experiment_1 import *
import Experiment_1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
并得到錯誤資訊:
File "C:\Program Files\Sublime Text 3\Experiment_2.py", line 10, in <module>
object_2.addition()
File "C:\Program Files\Sublime Text 3\Experiment_1.py", line 10, in addition
summed=object_1.x object_1.y
NameError: name 'object_1' is not defined
因此,object_2 不能再訪問 object_1 的變數。我一直在尋找解決方案來解決這個問題,但可能使用了錯誤的關鍵字,或者只是在我看到答案時缺乏理解來識別答案 - 誰能給我一個提示如何繼續?
提前致謝!
uj5u.com熱心網友回復:
問題是您在Experiment_1.py. 以下塊中的代碼僅在您將檔案作為腳本運行時才會執行,而不是在匯入時執行。
if __name__ == '__main__':
pass
因此,在您的 class 物件中B,addition方法中的以下陳述句,
#Experiment_1.py
summed=object_1.x object_1.y
see object_1as not defined,因為它僅在 if __name__ == '__main__':匯入模塊時未執行的塊中實體化。
看到這個問題:What do if __name__ == "__main__": do?
對于解決方案,如果您希望使用模塊結構,則解決方法是將物件傳遞給加法方法。
#Experiment_1.py
class A():
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B():
def addition(self, obj):
summed = obj.x obj.y
print(summed)
然后在你的下一個檔案中
from Experiment1 import *
# import Experiment1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition(object_1)
uj5u.com熱心網友回復:
匯入模塊時,if __name__ == "__main__":不會執行以開頭的塊,因為模塊的名稱變數設定為您匯入的名稱(在本例中為“Experiment_1”)。來自官方檔案:
匯入 Python 模塊或包時,名稱設定為模塊的名稱。通常,這是沒有 .py 擴展名的 Python 檔案本身的名稱
如果您希望您的代碼無論是從命令列匯入還是直接運行都得到執行,只需將其放在底部即可。
uj5u.com熱心網友回復:
未測驗,但我認為以下腳本是解決方案,因為您需要繼承屬性。請測驗更改(在第一個模塊上)并給出回應。
class A():
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x=10
def process2(self):
self.y=20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x self.y
print(summed)
if __name__ == '__main__':
object_1 = A()
object_2 = B()
object_1.process1()
object_1.process2()
object_2.addition()
編輯
對不起,我沒有意識到 B 可以做所有的事情。這是一個很好的解決方案:
實驗1.py
class A:
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x self.y
print(summed)
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_1.process2()
object_1.addition()
實驗2.py
from Experiment1 import *
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_2.process2()
object_2.addition()
說明:因為B類繼承了A類的方法和屬性,所以不需要實體化A類。所有的作業都可以由B班來運行。
正如其他用戶所說,在 B 類中,您使用的是在匯入模塊時無法訪問的main 部分中宣告的全域變數,這是if __name__ == '__main__':
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373230.html
上一篇:在Java中向物件添加多個元素
