2017-04-18 48 views
1

我是編程和自學的新手。我已經使用Stack Exchange來查找許多問題的答案,而無需詢問(這是一個很好的社區),但我似乎無法在任何地方找到答案。如果這是重複的,我很抱歉。如何在Python中將對類/函數的調用轉換爲字符串?

我想分配一個方法給一個變量,但我想將它保存到一個文本文件以供以後訪問。我使用open()來訪問文本文件,並在加載信息時使用eval()從字符串中對其進行更改。我無法弄清楚如何做相反的事情。

from random import randint 

class Example (object): 
    def __init__(self): 
     self.name = "" 
     self.lucky_number = "" 

    def create_person(self): 
     self.name = input("What is your name?") 
     self.lucky_number = randint(1,10) 
     save_person = [self.name, self.lucky_number] 
     with open("example.txt", "w") as f: 
      for i in save_person: 
       f.write(i + '\n') 

    def load_person(self): 
     with open("example.txt", 'r') as f: 
      person_list = f.readlines() 
     if len(person_list) <= 1: 
      create_person() 
     else: 
      self.name = person_list[0].strip('\n') 
      self.lucky_number = eval(person_list[1].strip('\n')) 

person = Example() 
person.load_person() 

我想保持randint(1,10)的一部分,因爲我希望重用的功能,但我可以將值改爲別的東西以後根據用戶的選擇(如改變self.lucky_number = randint (1,10)到self.lucky_number = randint(1,30))。

我知道我可以將其更改爲self.lucky_number = randint(1,var),然後保存var的值,但它讓我懷疑如果我嘗試的方式是可能的。

在此先感謝您的幫助。我正在使用Python 3.5。

編輯:爲了澄清,我正在尋找在文本文件中存儲實際函數,即randint(1,10),而不是函數的值。

編輯2:我將關閉這個答案,因爲我找到了一種方法來做我所需要的,但它不是一個直接的方法。

+2

我想你可能想看看「在python中對象的序列化」。這可以讓您存儲對象並在稍後加載它們。 https://docs.python.org/3.5/library/pickle.html – user49438

+0

謝謝。我剛剛查看了你發佈的鏈接,這是我非常感興趣的事情。與此同時,我在我的Pi3上的Python 3.5和我的手機上的Pythonista之間彈跳,現在更容易檢查txt文件以確保每一步都正確寫入,並且我可以快速更改值以測試新增加的內容。下一步是弄清楚如何讓人們無法讀懂它,而且你感謝地指引我朝着正確的方向前進。謝謝! :)在此期間,更容易看到randint(1,10)將其改爲10以上。可能嗎? –

+0

所以你想要存儲函數調用('randint')*,包括它的參數*('1'和'10')?在這一點上,我不太瞭解需要存儲它,因爲它既不是用戶輸入(如名稱)也不是隨機確定的值(因爲您不再存儲該值,而是函數名稱和它的參數)。 –

回答

0

我能找到一種方法來完成我正在尋找的東西,但它是一個迂迴的方式。我將對該函數的調用改爲一個字符串,然後創建了一個新的類變量,該函數用函數字符串調用該變量。現在運行該函數的另一個類變量具有eval(),並調用我創建的新類變量。我保存新的類變量。

from random import randint 

# Now a string instead of a function call 
prog = "randint(1,10)" 

class Example (object): 
    def __init__(self): 
     self.name = "" 
"""Added self.temp to grab the string from outer 
variable and will change self.temp to get the desired 
functions as strings""" 
     self.temp = prog 
"""self.lucky_number grabs new class variable and 
eval() turns it into callable function""" 
     self.lucky_number = eval(self.temp) 

    def create_person(self): 
     self.name = input("What is your name?") 
     self.temp = prog 
     self.lucky_number = eval(self.temp) 
""" Saves new class variable now and stores actual 
function, eg randint(1,10)""" 
     save_person = [self.name, self.temp] 
     with open("example.txt", "w") as f: 
      for i in save_person: 
       f.write(str(i) + '\n') 

    def load_person(self): 
     with open("example.txt", 'r') as f: 
      person_list = f.readlines() 
     if len(person_list) <= 1: 
      self.create_person() 
     else: 
      self.name = person_list[0].strip('\n') 
      self.temp = person_list[1].strip('\n') 

person = Example() 
person.load_person() 

它的迂迴,但完成工作。我可以將self.temp更改爲我需要的任何變量(格式正確),並且代碼將工作。如果任何人都可以想到一個直接的方式,請讓我知道。

相關問題