【问题标题】:How do I reference to a class using a string in python?如何在 python 中使用字符串引用类?
【发布时间】:2018-05-06 14:15:16
【问题描述】:

我正在尝试制作一款有点像口袋妖怪的基于文本的游戏。进展顺利,但我在使用用户输入的字符串访问移动时遇到了问题(移动是类)。将会创建很多动作,但我实际上不知道这是否会影响这种访问的完成方式。每当我运行我的代码或下面的类似代码时,我都会收到此错误。

what is a classname you want? myClass
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    Main()
  File "main.py", line 10, in Main
    print(userClass.name)
AttributeError: 'str' object has no attribute 'name'

这是我一直在使用的简化版本的代码。

def Main():
    class X():
        name=""

    myClass=X()
    myClass.name="this"

    userClass=str(input('what is a classname you want?'))
    print(userClass.name)
Main()

更新: 我根据编辑更改了我使用的内容,但仍然出现错误。代码如下:

def Main():
    class X():
        name=""

    myClass=X()
    myClass.name="this"

    userClass = globals()[str(input('What is a class name you want?'))]
    print(userClass.name)
Main()

这是我得到的错误:

What is a class name you want? myClass
Traceback (most recent call last):
  File "python", line 10, in <module>
  File "python", line 8, in Main
KeyError: 'myClass'

【问题讨论】:

    标签: string python-3.x class


    【解决方案1】:

    您可以使用locals()。之前,我建议使用globals()。但是,myClass 不在全局范围内,因此 globals() 将不起作用。代码如下所示:

    userClass = locals()[str(input('What is ...'))]
    print(userClass.name)
    

    不过,我必须说,我相信他们是解决您问题的更好方法。但是,这已经超出了这个问题的范围。


    这是我在他澄清之前的第一个答案

    userClass 不是用户定义的类实例。在您的情况下,它不是 X 类的实例。相反,它被声明为字符串。并且字符串没有name 属性。这就是导致您的错误的原因。

    您要做的是根据您的代码将userClass 设为X 类的实例。

    userClass = X()
    

    要使用一些用户输入设置userClassname 属性,您只需执行以下操作:

    userClass.name = str(input('what is a classname you want?'))
    print(userClass.name)
    

    旁注

    • AttributeErrors 在您访问对象中不存在的属性时发生。
    • 在Python 中,建议您使用snake case 而不是camel case。 IE。 userName 将是 user_name。函数名称以小写开头。
    • X 类中的变量name 是一个静态变量。这意味着,如果您有多个 X 实例,并且您在某处为 X 的实例中赋予 name 一个新值,那么所有其他实例也将具有 name 的新值。

    【讨论】:

    • 对不起,我想我解释得不好。我想要做的是输入 myClass 作为输入,然后如果我将变量 userClass 插入某处,则能够访问 myClass 的值,但是我得到 myClass 没有名称属性的错误。感谢您对python中常见做法的解释!
    • @BigBoiBif,如果我做对了,您希望userClass 代表/成为myClass 的“指针”。正确的?根据您的问题,玩家通过输入他们想要的移动来移动,而该移动是一个类实例?
    • 是的,这就是我想要它做的事情
    • 我使用了您的编辑,但仍然出现错误,我不太清楚为什么...
    • 你想要的类名是什么? myClass Traceback(最近一次调用最后):文件“python”,第 10 行,在 文件“python”,第 8 行,在 Main KeyError:'myClass'
    【解决方案2】:

    我最终想通了,并通过使用字典来做到这一点。这是它背后的代码。

    def Main():
        class aClass():
            name=""
        myClass=aClass()
        myClass.name="this"
    
        classes={}
        classes["myClass"]=myClass
    
        userClass=str(input('class name'))
        print(classes[userClass].name)
    
    Main()
    

    【讨论】:

    • 我会将映射移出,以便 1) 每次运行函数时都不会重新创建它,以及 2) 可以通过其他模块中的代码添加它。这些在这个玩具代码中可能无关紧要,但它们可以在实际项目中产生巨大的影响。
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多