Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用存储的then创建类,然后使用输入调用函数(如果存在)?_Python_Python 3.x - Fatal编程技术网

Python 使用存储的then创建类,然后使用输入调用函数(如果存在)?

Python 使用存储的then创建类,然后使用输入调用函数(如果存在)?,python,python-3.x,Python,Python 3.x,这就是我想做的: 1.从类模板生成多个类实例。2.在每个类中存储一个函数。3.检查用户输入以查看它是否与其中一个类匹配。4.使用关联的函数 我基本上是一个初学者,所以请容忍我/使用简单的英语,对不起。无论如何,我已经尝试了我能想到的任何东西,并且已经在谷歌上搜索了几个小时。我希望用户能够输入文本,如果文本与类实例匹配,则调用该实例中的关联函数(或其他类属性) 因此,如果他们键入“option_a”,我希望它检查是否有一个名为option_a的类实例,在该实例中查找以执行其关联函数(myfunc_

这就是我想做的: 1.从类模板生成多个类实例。2.在每个类中存储一个函数。3.检查用户输入以查看它是否与其中一个类匹配。4.使用关联的函数

我基本上是一个初学者,所以请容忍我/使用简单的英语,对不起。无论如何,我已经尝试了我能想到的任何东西,并且已经在谷歌上搜索了几个小时。我希望用户能够输入文本,如果文本与类实例匹配,则调用该实例中的关联函数(或其他类属性)

因此,如果他们键入“option_a”,我希望它检查是否有一个名为option_a的类实例,在该实例中查找以执行其关联函数(myfunc_a)


我不知道如何做最后一部分。这就是我目前所处的位置,但我得到了一个错误:“AttributeError:'str'对象没有属性'actions'”。我知道我可能完全错了。

不要将类的实例存储在单独的变量中,而是将它们作为值存储在字典中:

options = {
    "option_a": UserSelect("Option A", "This is option A.", True, myfunc_a),
    "option_b": UserSelect("Option B", "This is option B.", True, myfunc_b)
}
并确保类提供的其中一个方法将实际调用存储的函数:

class UserSelect:
    # other stuff...
    def invoke(self):
        # add whatever logic is needed to determine the parameters for the call...
        self.action()
然后使用用户的字符串输入作为字典的键,获取相应的实例并调用该方法:

userin = input("What would you like to do? ")
options[userin].invoke()

由于您使用的是
input
,因此
userin
只是一个字符串,您可以将创建的对象放入字典中

created_objects = {'option_a': option_a, 'option_b': option_b}
然后,使用
try except
block-like

userin = input("What would you like to do? ")
try:
    user_obj = created_objects[userin]
    print("Doing task.")
    # the task 

except KeyError:
    print("Unrecognized command.\n")
重新格式化的代码

这是您的代码的一个重新格式化版本,您可以从中进一步了解python类

def myfunc_a(name):
    print("action %s." % name)
def myfunc_b(name):
    print("action %s." % name)

class UserSelect():
    count = 0 

    def __init__(self, title, desc, usable, action):
        self.title = title
        self.desc = desc
        self.perm = False
        self.action = action

        # I don't really understand what you are trying to do here 
        # UserSelect.count += 1

    def describe(self):
        print ("\n%s \n%s" % (self.title, self.desc))

    def actions(self, data):
        self.action(data)


option_a = UserSelect("Option A", "This is option A.", True, myfunc_a)
option_b = UserSelect("Option B", "This is option B.", True, myfunc_b)
created_objects = {'option_a': option_a, 'option_b': option_b}

userin = input("What would you like to do? ")
try:
    user_obj = created_objects[userin]
    print("Doing task.")
    user_obj.actions('a')

except KeyError:
    print("Unrecognized command.\n")

这解释了/帮助了很多!起初我正在检查字典,但不知道如何将它们链接到函数。我没有意识到你可以在没有()的情况下直接把实际的函数放到那里,它会工作的。非常感谢。请允许我再问一个问题;如何正确地检查实例是否存在?我尝试了“if-isinstance(userin,UserSelect):”但它没有做任何事情。好吧,我让它工作了,但它似乎只使用与UserSelect相关联的默认操作(option-a),我无法让它调用实际的实例选项(如option_b)。我认为在这种情况下,您需要问一个新问题,并展示您现在正在尝试的内容。试着用一个最小的例子来说明问题;切掉像
描述
方法等功能。@LiterallyMom因此,一个需要研究的重要概念是:Python中的函数是“一流对象”,这意味着如果你
def func():…
那么
func
只是一个函数对象,就像
列表
str
,你可以把它传递给另一个函数,或者从函数返回,放入列表,或者dict等等。不是所有的编程语言都有一流的对象,但是Python有,这使得这类事情很容易。这对我来说是最有意义的,但是我如何让它完成实际任务呢?我尝试使用选项[userin].invoke(),但它似乎只使用类结构中的默认任务。不是分配给实例的。@Mom我已经添加了您的代码的重新格式化版本,我认为这足以解决您的困惑。谢谢!这正是我需要的!我花了几个小时试图自己弄明白,因为我想理解,而不仅仅是让别人给我代码,所以谢谢你。我想我在这里做的更多@妈妈,不客气我很高兴我的回答对你有帮助!:)
def myfunc_a(name):
    print("action %s." % name)
def myfunc_b(name):
    print("action %s." % name)

class UserSelect():
    count = 0 

    def __init__(self, title, desc, usable, action):
        self.title = title
        self.desc = desc
        self.perm = False
        self.action = action

        # I don't really understand what you are trying to do here 
        # UserSelect.count += 1

    def describe(self):
        print ("\n%s \n%s" % (self.title, self.desc))

    def actions(self, data):
        self.action(data)


option_a = UserSelect("Option A", "This is option A.", True, myfunc_a)
option_b = UserSelect("Option B", "This is option B.", True, myfunc_b)
created_objects = {'option_a': option_a, 'option_b': option_b}

userin = input("What would you like to do? ")
try:
    user_obj = created_objects[userin]
    print("Doing task.")
    user_obj.actions('a')

except KeyError:
    print("Unrecognized command.\n")