首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有用户输入和调用方法的类

具有用户输入和调用方法的类
EN

Code Review用户
提问于 2018-08-24 19:37:59
回答 1查看 15.7K关注 0票数 1

在这第一周学习了很多,跟随PCC,但最大的飞跃来自社区和其他付出时间的帮助,谢谢!

感谢所有的输入!

目标目标是用来自多个用户的用户输入填充一个类,然后能够对每个用户输入创建的类调用方法。(...我说得对吗?

代码

代码语言:javascript
运行
复制
class User():
    def __init__(a, first_name, last_name, city, age):
        a.first_name = first_name.title()
        a.last_name = last_name.title()
        a.city = city.title()
        a.age = age

    def describe_user(a):
        print("-----")
        print("First Name" + " : " + a.first_name)
        print("Last Name" + " : " + a.last_name)
        print("City" + " : " + a.city)
        print("Age" + " : " + a.age)

def ask_user(message=''):
    user_input = ''
    while not user_input:
        user_input = input(message)
    return user_input

def form_complete(values, placement, length):
    placement = []
    while len(placement) < length:
        first_name = ask_user("Enter First Name: ")
        last_name =  ask_user("Enter Last Name: ")
        city = ask_user("Enter City: ")
        age = ask_user("Enter Age: ")
        values = User(first_name, last_name, city, age)
        placement.append(values)
    return placement

if __name__ == '__main__':

    users = form_complete('user', 'users', 3)
    for a in range(len(users)):
        users[a].describe_user()

输出

代码语言:javascript
运行
复制
xenial)vash@localhost:~/pcc/9$ python3 3.py
Enter First Name: vash
Enter Last Name: the stampede
Enter City: gunsmoke
Enter Age: 131
Enter First Name: spike
Enter Last Name: spiegel
Enter City: mars
Enter Age: 27
Enter First Name: holden
Enter Last Name: caulfield
Enter City: new york city
Enter Age: 16
-----
First Name : Vash
Last Name : The Stampede
City : Gunsmoke
Age : 131

Greetings Vash!
-----
First Name : Spike
Last Name : Spiegel
City : Mars
Age : 27

Greetings Spike!
-----
First Name : Holden
Last Name : Caulfield
City : New York City
Age : 16

Greetings Holden!
(xenial)vash@localhost:~/pcc/9$
EN

回答 1

Code Review用户

发布于 2018-08-25 08:18:29

Python有一些叫做魔术方法的东西(有时也叫dunder,但另一个名字更酷)。

这些方法具有特殊的名称,并允许自定义类使用内置功能。例如,如果您编写一个自定义数字类,您可能希望能够执行例如a + b,其中至少有一个是类的实例(另一个也可以,甚至只是一个普通的数字)。为了实现这一点,您只需为类实现一个适当的__add__方法。

这是一个很好的清单通过了所有可用的魔术方法。

在您的类中,我们可以使用__str__方法。当您调用str(obj)print(obj)"{}".format(obj) (除非您还实现了__format__方法)时,可以使用它:

代码语言:javascript
运行
复制
class User:
    def __init__(self, first_name, last_name, city, age):
        self.first_name = first_name
        self.last_name = last_name
        self.city = city
        self.age = age

    def __str__(self):
        s = ["-----",
             f"First Name : {self.first_name}",
             f"Last Name : {self.last_name}",
             f"City : {self.city}",
             f"Age : {self.age}"]
        return "\n".join(s)

请注意,我做了一些更多的更改:

  • 不需要类名后面的空括号。如果要从其他类继承,则只需要括号。
  • 我还调用了方法self的第一个参数,这是Python中的惯用名称。
  • 我没有使用简单加法构建字符串,因为这在Python中非常慢(字符串是不可变的对象,因此每个字符串添加都涉及创建一个长度合适的新字符串,并复制所添加的两个字符串的内容)。
  • 最后,我使用f-strings来使格式化变得更容易一些。

在您的form_complete函数( IMO应该称为complete_form,因为它描述了一个操作)中,您可以使用列表理解:

代码语言:javascript
运行
复制
def complete_form(n_users):
    return [User(ask_user("Enter First Name: ").title(),
                 ask_user("Enter Last Name: ").title(),
                 ask_user("Enter City: ").title(),
                 ask_user("Enter Age: ", type=int)
            for _ in range(n_users)]

请注意,我在这里移到了str.title,因为传递正确值应该是您类的用户的责任(例如,如果您的用户输入了一个title()没有意义的名称怎么办?还有一些名字以小写字母开头。等等.

我还从签名中删除了valuesplacement,因为您可以立即重写它们。

最后,我向ask_user添加了一个关键字参数,它允许您验证年龄实际上是一个整数:

代码语言:javascript
运行
复制
def ask_user(message='', type=str):
    user_input = ''
    while not user_input:
        try:
            user_input = type(input(message).strip())
        except ValueError:
            continue
    return user_input

默认情况下,这只会对用户提供的任何内容调用str函数。如果您指定了type=int,它将对输入调用int,如果它不能解析作为int接收的输入,则会引发ValueError

这现在只有一个缺点:如果用户想要输入解析为0的内容,他们就会陷入一个无限循环中(因此不允许1岁以下的用户)。

我还向str.strip添加了一个调用,因此也不允许使用(空格)和(选项卡)之类的用户名。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/202427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档