在这第一周学习了很多,跟随PCC,但最大的飞跃来自社区和其他付出时间的帮助,谢谢!
感谢所有的输入!
目标目标是用来自多个用户的用户输入填充一个类,然后能够对每个用户输入创建的类调用方法。(...我说得对吗?
代码
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()输出
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$发布于 2018-08-25 08:18:29
Python有一些叫做魔术方法的东西(有时也叫dunder,但另一个名字更酷)。
这些方法具有特殊的名称,并允许自定义类使用内置功能。例如,如果您编写一个自定义数字类,您可能希望能够执行例如a + b,其中至少有一个是类的实例(另一个也可以,甚至只是一个普通的数字)。为了实现这一点,您只需为类实现一个适当的__add__方法。
这是一个很好的清单通过了所有可用的魔术方法。
在您的类中,我们可以使用__str__方法。当您调用str(obj)、print(obj)、"{}".format(obj) (除非您还实现了__format__方法)时,可以使用它:
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中的惯用名称。f-strings来使格式化变得更容易一些。在您的form_complete函数( IMO应该称为complete_form,因为它描述了一个操作)中,您可以使用列表理解:
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()没有意义的名称怎么办?还有一些名字以小写字母开头。等等.
我还从签名中删除了values和placement,因为您可以立即重写它们。
最后,我向ask_user添加了一个关键字参数,它允许您验证年龄实际上是一个整数:
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添加了一个调用,因此也不允许使用(空格)和(选项卡)之类的用户名。
https://codereview.stackexchange.com/questions/202427
复制相似问题