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



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

来做到这一点
class myStruct():
    def __init__(self,name,salary,doB,title):
        self.name=name
        self.salary=salary
        self.doB=doB
        self.title=title

现在,我想创建该类的对象。但是我希望用户为每个对象输入所有变量本身,并且对象的名称将是用户输入的名称。我看到了一些描述这样的内容的其他堆叠页面,例如此链接如何在Python中动态创建类的实例?但这与从另一个模块导入的类有关,我不了解klass = global()[" class_name"]。我不明白如何链接从用户输入的字符串以使用global()。

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

编辑:我认为有些人不了解我要做的事情。重点不是写

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

在我的代码中,但是要具有一个函数,该函数可创建一个以姓名输入的用户命名的实例。所以这会像

name=input('Enter your name') 
'%s' %name=MyStruct(name) 

你明白了吗?该名称被替换为

# 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

中的第一个字母打电话给您的课程。

你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
    

我遇到了一个类似的问题...但是在我的情况下,我的输入"名称"来自文件,属性的数量可能会有所不同。以下是我当前的解决方案。我敢肯定,有更好的方法可以做到这一点,我希望其他人可以提供这些方法。

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

尝试通过使用两种方式将其传递给 init 将其传递到 inter inture:input(input(input()或raw_input()。

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

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)

最新更新