python重复函数3次



此代码的目的是:

  1. 要求用户输入自己的姓名
  2. 要求用户输入出生日期
  3. 代码将把名字分为名字、中间名和姓氏
  4. 该代码将以年、月和天为单位计算年龄
  5. 代码将把所有这些数据存储在字典中

这是代码:

from datetime import datetime
from dateutil.relativedelta import relativedelta

class Test:
def __init__(self):
self.today = datetime.today()

def name(self):
first_name, middle_name, last_name = input("enter your name:n".title()).split(' ')
return first_name, middle_name, last_name

def age(self):
date_of_birth = input("enter your date of birth:n")
date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
age = relativedelta(self.today, date_of_birth)
return age

def data(self):
data = {"first name": self.name()[0],
"middle_name": self.name()[1],
"last name": self.name()[2],
"age years": self.age().years,
"age months": self.age().months,
"age days": self.age().days}
print(data)


Test().data()

代码没有错误。

但关于姓名和年龄的问题,每一个都重复了三次。像这个

输入您的出生日期:

1986年9月26日

输入您的出生日期:

1986年9月26日

输入您的出生日期:

1986年9月26日

您正在调用age()三次。你可以给它打一次电话,然后访问它的成员:

def data(self):
name = self.name()
age = self.age()
data = {"first name": name[0],
"middle_name": name[1],
"last name": name[2],
"age years": age.years,
"age months": age.months,
"age days": age.days}
print(data)

我建议您使用实例并调用init方法本身中的名称输入,如下所示:

class Test:
def __init__(self):
self.today = datetime.today()
self.full_name = input("enter your full name:n".title()).split(' ')
self.dob = input("enter your date of birth:n")
@property
def name(self):
first_name, middle_name, last_name = self.full_name
return first_name, middle_name, last_name
@property
def age(self):
date_of_birth = self.dob
date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
age = relativedelta(self.today, date_of_birth)
return age
def data(self):
data = {"first name": self.name[0],
"middle_name": self.name[1],
"last name": self.name[2],
"age years": self.age.years,
"age months": self.age.months,
"age days": self.age.days}
print(data)

因此,当您实例化类对象并在任何需要使用的时候使用数据方法时,您将实际初始化__init__方法中需要作为输入的值,它将把值存储到变量中,直到您重新实例化它。

您将分别调用self.ageself.name三次。您应该只调用它们中的每一个一次,并将结果保存到相关变量中。

也许将这些变量设置为实例的属性以备将来使用是件好事,但作为解决问题的最低方法,这里有一个data版本,它只执行一次相关调用。

def data(self):
first_name, middle_name, last_name = self.name()

age = self.age()

data = {"first name": first_name,
"middle_name": middle_name,
"last name": last_name,
"age years": age.years,
"age months": age.months,
"age days": age.days}
print(data)

每次调用nameage函数时,它们都会重新提示用户进行新的输入。最好将它们缓存起来;您可以自己将其存储为实例属性,或者只使用functools.lru_cache:

from functools import lru_cache
...
@lru_cache
def name(self):
first_name, middle_name, last_name = input("enter your name:n".title()).split(' ')
return first_name, middle_name, last_name
@lru_cache
def age(self):
date_of_birth = input("enter your date of birth:n")
date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
age = relativedelta(self.today, date_of_birth)
return age

相关内容

  • 没有找到相关文章

最新更新