如何在Python中将对类/函数的调用转换为字符串?

时间:2017-04-18 23:02:05

标签: python

我是编程和自学的新手。我已经使用Stack Exchange来查找我的许多问题的答案,而不需要问(这是一个很棒的社区),但我似乎无法在任何地方找到答案。如果这是重复,我道歉。

我正在尝试为变量分配方法,但我想将其保存到文本文件中以便以后访问。我正在使用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) )to self.lucky_number = randint(1,30))。

我知道我可以将它改为self.lucky_number = randint(1,var),然后保存var的值,但它让我想知道我正在尝试的方式是否可行。

提前感谢您的任何帮助。我使用的是Python 3.5。

编辑:为了澄清我想在文本文件中存储实际函数,即randint(1,10),而不是函数的值。

编辑2:我将接受这个回答,因为我找到了一种方法来做我需要的,但这不是直接的方式。

1 个答案:

答案 0 :(得分: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更改为我需要的任何变量(格式正确)并且代码可以工作。如果有人能想到直接的方式,请告诉我。