说我想在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)
你知道了吗?名称将替换为。
答案 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:
只需使用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)
或者,你可以稍微调整一下__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)