从字符串用户输入Python创建类的对象

时间:2017-09-03 23:01:33

标签: python database string instance

说我想在Python中实现一个简单的数据库。我这样做是通过创建一个类

class myStruct():
    def __init__(self,name,salary,doB,title):
        self.name=name
        self.salary=salary
        self.doB=doB
        self.title=title

现在,我想创建该类的对象。但我希望用户为每个对象输入所有变量本身,对象的名称将是用户输入的名称。我看到其他一些描述类似内容的StackOverflow页面,例如此链接how to dynamically create an instance of a class in python? 但这与从另一个模块导入的类有关,我不理解klass = global()[“class_name”]。我不明白如何从用户输入的字符串链接到使用global()。

同样,这个想法甚至是用户输入myStruct类的每个对象的名称,以及该对象的所有其他字段。我该怎么做?

编辑:我不认为有些人理解我想要做的事情。关键是不要写出来

instance=MyStruct(name,salary,doB,title)

在我的代码中,但是,有一个函数创建一个以名称输入的用户命名的实例。所以它会像

name=input('Enter your name') 
'%s' %name=MyStruct(name) 
你知道了吗?名称将替换为。

4 个答案:

答案 0 :(得分:2)

# Collect the data from user
nameVar = input('Type the name: ')
salVar = input('Type the salary: ')
dobVar = input('Type the doB: ')
titleVar = input('Type the title: ')

# Create the instance of the myStruct object
myInstance = myStruct(nameVar, salVar, dobVar, titleVar)

顺便说一下,在没有大写的情况下命名一个类的坏风格。你应该总是用大写的第一个字母=>来调用你的类。 MYSTRUCT

答案 1 :(得分:0)

你coculd:

  1. 只需使用myStruct并在询问参数后创建一个对象,如下所示:

    class myStruct():
        def __init__(self, name, salary, doB, title):
            self.name = name
            self.salary = salary
            self.doB = doB
            self.title = title
    
    name = raw_input('Enter name: ')
    salary = raw_input('Enter salary: ')
    doB = raw_input('Enter doB: ')
    title = raw_input('Enter title: ')
    
    new_object = myStruct(name, salary, dob, title)
    
  2. 或者,你可以稍微调整一下__init__来做你需要的事情。它可能不整洁,但它会起作用。

    class myStruct():
        def __init__(self,name=None,salary=None,doB=None,title=None):
            if not name:
                self.name = raw_input('Enter name: ')
            else:
                self.name=name
            if not salary:
                self.salary = raw_input('Enter salary: ')
            else:
                self.salary=salary
            if not soB:
                self.doB = raw_input('Enter doB: ')
            else:
                self.doB=doB
            if not title:
                self.title = raw_input('Enter title: ')
            else:
                self.title=title
    

答案 2 :(得分:0)

我遇到了类似的问题……但是,就我而言,我的输入“名称”来自文件,并且属性的数量可以变化。以下是我当前的解决方案。我敢肯定,有更好的方法可以做到这一点,希望其他人也可以提供这些方法。

import numpy as np

class Target():
    sample = {}
    @classmethod
    def create(cls, name):
        target = Target(name)
        cls.sample[name] = target
        return target
    def __init__(self, name):
        self.name = name


names = ('Moon', 'Earth', 'Mars')
# gravity in units of m / s^{-2}
grav = np.array([1.620, 9.807, 3.711])
sample = {}
for idx in np.arange(0, len(names), 1):
    name = names[idx]
    sample[name] = Target(name)
    setattr(sample[name], 'grav', grav[idx])
    if (name == names[1]):
        # number of moons
        setattr(sample[name], 'num_moons', 1)
    elif (name == names[2]):
        # number of moons
        setattr(sample[name], 'num_moons', 2)

for idx in np.arange(0, len(names), 1):
    name = names[idx]
    print(sample[names[idx]].name + ':')
    print('    Gravity = %.3f (m s^{-2})'%sample[names[idx]].grav)
    if (idx == 1):
        print('    Number of moons = %i'%(sample[names[idx]].num_moons))

P.S。您可以想象我的输入文件有三行,并且每一行都有不同的长度(但不难转换为列表和numpy数组)。 月亮1.620 地球9.807 1 火星3.711 2

答案 3 :(得分:0)

尝试使用两种方式从类外部正常地将其传递给 init 来输入字符串:input()或raw_input()。

名为output_all的功能用于打印保存的数据。

class myStruct():
        def __init__(self,name,salary,doB,title):
            self.name=name
            self.salary=salary
            self.doB=doB
            self.title=title
        def output_all(self):
            print( '{} \n{} \n{} \n{}'.format(self.name,self.salary, self.doB, 
            self.title))

    user = myStruct(
        name = input('type your name: '),
        salary = input('type your salary : '),
        doB = input('type your doB: '),
        title = input('type you title : ') 
        )

    myStruct.output_all(user)