【问题标题】:How do I use raw_input with classes in a definition如何在定义中将 raw_input 与类一起使用
【发布时间】:2018-08-22 13:04:51
【问题描述】:

问题

我正在用 Python 2.7 编写一个脚本,让用户输入元素的原子符号。然后脚本会打印出有关元素的信息。

但是,我不确定如何让类使用来自raw_input 的变量。下面是为了便于阅读而去掉了 118 个元素中的几个的代码:

代码

class PTable(object):
    def __init__(self, name, atom_num, atom_sym, atom_mass,period, group, atom_type,state):
        self.name = name
        self.atom_num = atom_num
        self.atom_sym = atom_sym
        self.atom_mass = atom_mass
        self.period = period
        self.group = group
        self.atom_type = atom_type
        self.state = state

h = PTable("Hydrogen",1,"H",1.0079,1,1,"Nonmetal","Gas")
he = PTable("Helium",2,"He",4.0026,1,18,"Nonmetal","Gas")
li = PTable("Lithium",3,"Li",6.941,2,1,"Alkali metal","Solid")
be = PTable("Beryllium",4,"Be",9.0121831,2,2,"Alkaline earth","solid")
og = PTable("Oganesson",1,"H",1.008,1,1,"Nonmetal","Gas")

def results(name, num, sym, mass, per, gro, typ, state):
    print "Name:", name
    print "Atomic number:", num
    print "Atomic symbol:", sym
    print "Atomic mass:", mass
    print "Period:", per
    print "Group:", gro
    print "Type:", typ
    print "State:", state
# results(h.name, h.atom_num, h.atom_sym, h.atom_mass, h.period, h.group, h.atom_type, h.state)
def hub():
    x = raw_input("What element? ")
    results(%s.name, %s.atom_num, %s.atom_sym, %s.atom_mass, %s.period, %s.group, %s.atom_type, %s.state) % (x)
    hub()

hub()

错误

给我语法错误的代码是:

results(%s.name, %s.atom_num, %s.atom_sym, %s.atom_mass, %s.period, %s.group, %s.atom_type, %s.state) % (x)

错误很明显;语法错误,所以我尝试了另一种方法:

results(x.name, x.atom_num, x.atom_sym, x.atom_mass, x.period, x.group, x.atom_type, x.state)

这也不起作用,我得到了错误

Traceback(最近一次调用最后一次):

文件“C:/Users/NAME/Desktop/PTable.py”,第 146 行,在

hub()

文件“C:/Users/NAME/Desktop/PTable.py”,第 143 行,在中心

results(x.name, x.atom_num, x.atom_sym, x.atom_mass, x.period, x.group, x.atom_type, x.state)

AttributeError: 'str' 对象没有属性 'name'

问题

你知道我是怎么做到的,这样用户就可以输入元素的名称(原子符号)并且代码打印出信息吗?

【问题讨论】:

  • 您将字符串格式与类语法混淆了。也许寻找good python tutorial
  • Oganesson 有点新。

标签: python function class python-2.x raw-input


【解决方案1】:

恢复元素

x = raw_input("What element? ") 行为您提供了一个字符串,比如'he',因此当您调用x.name 时,您尝试访问的是该字符串的属性,而不是变量he 的属性。

您应该做的是将元素存储在字典中,而不是将它们作为变量并使用用户提供的键访问它们。

periodic_table = {
    'h': PTable("Hydrogen",1,"H",1.0079,1,1,"Nonmetal","Gas"),
    'he': PTable("Helium",2,"He",4.0026,1,18,"Nonmetal","Gas"),
    ...
}

symbol = raw_input("What element? ")

try:
    element = periodic_table[symbol]

except KeyError:
    print('This element does not exist')

打印元素

至于打印元素,我建议通过实现PTable.__str__ 方法来实现更面向对象的方法。

class PTable(object):

    ...

    def __str__(self):
        # Add in the format and information that you want to be printed
        return "Name: {}".format(self.name)

然后您可以直接打印您的元素。

print periodic_table['he']
# prints: 'Name: Helium'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多