如何在python中使用字符串引用类?

时间:2018-05-06 14:15:16

标签: string python-3.x class

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

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'

2 个答案:

答案 0 :(得分:0)

您可以使用locals()。以前,我建议使用globals()。但是,myClass不在全球范围内,因此globals()不起作用。代码看起来像:

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

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

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

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

您要做的是根据您的代码制作userClassX的实例。

userClass = X()

要使用某些用户输入设置userClass的{​​{1}}属性,您只需执行以下操作:

name

旁注

    当您访问对象中不存在的属性时,会出现
  • userClass.name = str(input('what is a classname you want?')) print(userClass.name)
  • 在Python中,建议您使用蛇形盒而不是驼峰盒。即AttributeError将是userName。函数名称以小写字母开头。
  • user_name内的变量name是一个静态变量。这意味着,如果您有X的多个实例,并且在X的某个实例中为name提供了新值,则所有其他实例的新值将为X同样。

答案 1 :(得分:0)

我最终想通了,我是通过使用词典来实现的。这是它背后的代码。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Welcome extends CI_Controller {

/**
 * Index Page for this controller.
 *
 * Maps to the following URL
 *         http://example.com/index.php/welcome
 *    - or -
 *         http://example.com/index.php/welcome/index
 *    - or -
 * Since this controller is set as the default controller in
 * config/routes.php, it's displayed at http://example.com/
 *
 * So any other public methods not prefixed with an underscore will
 * map to /index.php/welcome/<method_name>
 * @see https://codeigniter.com/user_guide/general/urls.html
 */
public function index()
{
    $this->load->view('welcome_message');
}
public function test()
{
    session_start();
    $_SESSION['admin']="1";
    $str =array("_SESSION"=>array("isadmin"=>"admin","user"=>"user1"));
    extract($str);
    print_r($_SESSION);
}

}