【问题标题】:The most Pythonic way to create an object with user inputs [closed]使用用户输入创建对象的最 Pythonic 方式 [关闭]
【发布时间】:2020-10-08 14:50:23
【问题描述】:

我想知道创建参数来自用户输入的对象的最 Pythonic 方式是什么。考虑这个例子:

class SomeClass:
    def __init__(self, a, b, c):
        self.x= a
        self.y= b
        self.z= c

我是否应该在其他地方(在另一个模块中?)要求用户输入 a、b、c 的值?或者,我是否应该将 x、y、z 设置为 None,然后从 init 函数调用帮助函数以提示用户设置参数值?完成此任务的最 Pythonic 方式是什么?我已经使用 Python 工作了几年,但我(最终)开始优先考虑样式和代码美学。

感谢您的帮助。

【问题讨论】:

    标签: python class oop initialization instantiation


    【解决方案1】:

    你可以用这个语句来结束它

    class SomeClass:
        def __init__(self, a, b, c):
            self.x= a
            self.y= b
            self.z= c
           
           
    if __name__ == "__main__":
        a = input("Enter a: ")
        b = input("Enter b: ")
        c = input("Enter c: ")
        some_class = SomeClass( a , b, c )
    

    【讨论】:

    • 这很好。谢谢你。但是,如果我想确保(例如)“a”可以转换为整数,那么在 int(input("Enter a: ")) 周围使用 try-except 语句是最简单的方法吗?我的程序有大约 10 个用户输入,我希望尽可能避免使用 10 个 try-catch 块,因为我更喜欢短模块。
    • 您可以创建一个 is_valid 函数,在每次迭代时测试数字并将有效输入保存在列表中...然后您可以使用列表构造对象
    • 我真的很喜欢这种方法。谢谢。
    【解决方案2】:

    也许最pythonic的方法是使用collections.namedtuple

    import collections
    
    a = input("Enter a: ")
    b = input("Enter b: ")
    c = input("Enter c: ")
    
    obj = collections.namedtuple('Class', [a, b, c])
    
    # Set value to each parameter
    obj.a = 10
    obj.b = 'Ghanteyyy'
    obj.c = True
    

    【讨论】:

      【解决方案3】:

      除了 Python 式的编码方式之外,您还询问编码的一般原则。通常,您的程序中永远不会只有一个类,除非您使用 python 编写脚本,而您只有一个源 (.py) 文件。您的程序中也有用户输入。您应该始终将数据和 UI 分开。所以单独的数据类和 UI 分开。 UI 类还可以在您使用输入创建数据对象之前验证输入。

      【讨论】:

      • 目前我的程序中有大约 15 个模块。有些用于计算。其他用于获取数据。其他的仍然用于显示数据。这个类旨在将所有这些结合在一起——通过一些用户输入。听起来正确的方法是使用仅用于获取输入的模块——以及另一个包含类本身的模块。对吗?
      【解决方案4】:

      在某些情况下,我们需要在 python 程序中获取用户输入,然后在类的初始化期间使用它。例如,如果我们有一个“人”类,它有两个属性名和姓。

      class Person:
           """
           A representation of a person 
           Attributes:
               Firstname(string)
               Lastname(String)
           """
           def __init__(self, first_name, last_name):
               self.firstname = first_name
               self.lastname = last_name 
           def show_full_name(self):
               return self.firstname + ' ' + self.lastname
      

      要使用此类创建人员对象,我们可以直接提供参数而无需用户输入。见下文。

      #instance by supplying arguments
      person1 = Person('John', 'Doe')
      person1.show_full_name()
      

      【讨论】:

      • 感谢您的回复——但这并不能完全回答我的问题。我正在构建一个交互式工具,最终用户将在运行程序时通过输入函数输入他想要的值(我的受众不是程序员,我缺乏 GUI 编程技能)。问题是这些是否应该放在类之外,然后将输入单独传递给 Class init 函数,或者是否应该在 Class 内有帮助函数来询问最终用户的值。我希望能澄清一些事情。
      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 2021-12-21
      • 2015-11-11
      • 2017-10-21
      • 2018-03-12
      • 2015-12-21
      • 2022-01-10
      相关资源
      最近更新 更多