【问题标题】:How to get user input within a Method (python)如何在方法中获取用户输入(python)
【发布时间】:2012-01-28 00:35:18
【问题描述】:

我仍在学习如何在课堂上工作。我正在尝试使用 self 方法(培训练习)从用户那里获取用户输入。

这是我的代码(我只想获取用户输入并显示它,但使用方法)

import os
import time

class Programs: 
        def basicintro(self):
                print "Welcome to the BMR Calculator"
                time.sleep(1)      
        def createname(self,name):
                self.name = name
        def ask(self):
                while name == "":
                        name = raw_input("Name:")
                        if name != "":
                                print "Hello", name
                                time.sleep(1)
                        else:
                                print name                
def main():
        object1 = Programs()
        object1.basicintro()
        object1.createname()
        object1.ask()    
        raw_input("\n\nPress enter to exit.")          
main()

我基本上只是想让用户输入他们的名字,然后让他们的名字成为一个对象,所以如果我稍后在程序中需要它,我可以直接调用它

【问题讨论】:

  • 那么你遇到了什么问题?
  • 使用 setattr(self, func_name, function)

标签: python


【解决方案1】:

我想说你的代码有几个问题:

  1. 首先你需要一个好的输入循环,我用一个简单的:

    while 1: # infinite loop
        name = raw_input("Name: ")
        if name == "":
            print "Ops! Retry"
        else:
            print "Hello", name
            break  # this will break the loop
    
  2. 让我们把这个循环放在你的班级里:

    class Programs:
    
        def ask(self):
            while 1: # infinite loop
                name = raw_input("Name: ")
                if name == "":
                    print "Ops! Retry"
                else:
                    print "Hello", name
                    break  # this will break the loop
    
  3. 据我了解,您希望将用户提供的名称存储为您的 Program 类实例的属性,因此:

    class Programs:
    
        def __init__(self):  # class constructur (called at creation time)
            self.name = ""   # the default name is the empty string
    
        def ask(self):
            while 1: # infinite loop
                name = raw_input("Name: ")
                if name == "":
                    print "Ops! Retry"
                else:
                    print "Hello", name
                    break  # this will break the loop
    
            self.name = name  # assign to self.name the value name
    

    例子:

    >>> prog = Programs()
    >>> prog.name
    ''
    >>> prog.ask()
    Name: Rik
    Hello Rik
    >>> prog.name
    'Rik'
    

    如您所见,方法__init__ 被立即调用并将空字符串分配给prog.name

  4. 如果您想将该示例代码放入您的脚本中,请执行以下操作:

    class Programs:
    
        def __init__(self):  # class constructur (called at creation time)
            self.name = ""   # the default name is the empty string
    
        def ask(self):
            while 1: # infinite loop
                name = raw_input("Name: ")
                if name == "":
                    print "Ops! Retry"
                else:
                    print "Hello ", name
                    break  # this will break the loop
    
            self.name = name  # assign to self.name the value name
    
    
    if __name__ == '__main__':
        prog = Programs()
        prog.ask()
        raw_input("\n\nPress enter to exit.")
    

    如果您愿意,您可以将该代码放在一个函数中,但我想展示if __name__ == '__main__': 的用法。信息可以在这个井answered question找到。

【讨论】:

  • 感谢两位的意见!现在有道理了,我有点害怕开始乱扔init。我明白你做了什么。我想我有一个大致的想法,但我的位置不对。
  • @hijaked79:不客气!当您找到有用的答案时(就像我认为您找到了这个答案一样),您也可以对其进行投票,这将不胜感激:)
【解决方案2】:

在ask方法中,每次写入name,都应该是self.name

例如:

while name == "":
# to
while self.name == "":

在你的 main 函数中,object1.createname() 会报错。它需要两个参数。正在传递函数外部称为 object1 和内部 self 的隐式函数。但是,您不会为 name 提供值。

object1.createname("Joe")

这些行仅在 name 为空字符串时执行。所以print '\n' 会做同样的事情。省略它只会在每一行上创建一个“名称:”,直到给出有效的输入。

else:
    print self.name # "self." added

考虑定义一个 init 方法,该方法采用名称。这样,您可以在创建类时设置一个。你也可以给一个默认值,它不会影响你当前的调用(它是可选的,所以如果你以后想给一个名字,你可以。

def __init__(self, name="SomeDefaultName"):
   pass # Content here

【讨论】:

  • 我编辑和添加的信息比已有信息多 3 倍。
  • 感谢您的帮助,我将详细了解 init
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多