[英]How to print the Name and Gender by using class and methods?
我正在編寫一個程序,它將呈現輸入的人的姓名和性別。 程序應該詢問姓名,然后詢問性別,直到用戶只按Enter
作為姓名。 只有在按下Enter
后,所有人的文本才應為 output。 我之前嘗試過實現一些代碼,但不幸的是我沒有得到任何結果。
class Person():
def __init__(self):
self.name = input('Name: ')
self.gender= input('Gender: ')
def give_name(self):
return self.name
def give_gender(self):
return self.gender
def show_name(self):
return self.give_name() + ' is ' + self.give_gender()
my_person = Person()
print(my_person.show_name())
最后應該 output 如下:
Name: Maya Mitermacht
Gender: female
Name: Max Mustermann
Gender: male
Name:
Maya Mitermacht is female
Max Mustermann is male
由於輸入將決定是否創建 object,因此不能由對象/類本身來自動初始化它。 您必須有辦法知道輸入是否為空。
因此,您應該將此委托給另一個 class 方法,從您的主程序中調用它並檢查返回值。 例如,在下面的代碼中,我選擇在 function 中返回 True 或 False。
class Person():
def initialize(self):
name_entered = input('Name: ')
if name_entered == '':
return False
gender_entered = input('Gender: ')
if gender_entered == '':
return False
self.name = name_entered
self.gender = gender_entered
return True
def give_name(self):
return self.name
def give_gender(self):
return self.gender
def show_name(self):
return self.give_name() + ' is ' + self.give_gender()
persons = []
while True:
my_person = Person()
isCreated = my_person.initialize()
# if it returned False, then user has entered nothing for gender or name, stop the loop
if (not isCreated):
break
#other wise, person is initialized, let's add it to the list and continue
persons.append(my_person)
for person in persons:
print(person.show_name())
受@Pac0 的啟發,我正在提交另一個答案,盡管他的答案已經足夠並且效果很好!
一直困擾我的一件事只是概念問題,而不是效率或有效性。 這個想法是:如果我們想停止創建Person
,我們應該在創建下一個之前這樣做,而不是在創建之后。
為此,我提出了一個使用__new__
的替代方案。 也許不是最好的使用它,但它按預期工作並且具有停止在實例之間創建對象的“功能”,而不是在最后一個之后。
class Person:
name: str
gender: str
def __new__(cls):
cls.name = input('Name: ')
if cls.name:
cls.gender = input('Gender: ')
return super(Person, cls).__new__(cls)
else:
raise ValueError("A name is required to create a Person instance")
def __init__(self):
self.name = Person.name
self.gender = Person.gender
def give_name(self):
return self.name
def give_gender(self):
return self.gender
def show_name(self):
return self.give_name() + ' is ' + self.give_gender()
def main():
people = []
while True:
try:
new_person = Person()
except ValueError:
break
else:
people.append(new_person)
for person in people:
print(person.show_name())
if __name__ == "__main__":
main()
這個想法是使用__new__
來捕獲輸入,然后檢查是否提供了名稱。 如果是,繼續獲取性別並創建新的Person
實例。 否則,提出一個例外,因為一個人需要一個名字。
用法很簡單,我們可以根據需要創建任意數量的人(這里我將它們全部存儲在people
列表中。完成后,不提供下一個Person
的名稱,這將引發ValuError
,我們捕獲並中斷從循環中。然后,打印所有名稱。
由於我已經在這里,我還將對代碼提出一些一般性建議。 首先,getter 和 setter 在 Python 中並不常見,通常不鼓勵使用。 因此,一個person.give_name()
可以簡單地被person.name
交換,當它只在 class 中使用時甚至更多。 使用這個想法,我們可以將give_name
、 give_gender
和show_name
方法簡化為:
class Person:
name: str
gender: str
.
.
.
def show_name(self):
return self.name + ' is ' + self.gender
接下來,相信我們可以好好利用Python中的另一種“神奇”的方法,那就是__str__
。 由於我們使用名稱和性別來標識Person
實例,並且我們希望以特定方式顯示該信息,因此我們可以簡單地定義Person
如何表示為 string 。 我們使用__str__
(在類內部)來做到這一點,例如:
def __str__(self):
return f"{self.name} is {self.gender}"
注意: f-strings非常簡潔且易於使用,但如果您不是粉絲,請將其替換為self.name + ' is ' + self.gender
。
這樣,當我們在Person
實例上調用str()
時,它將返回相同的字符串。 如果我們直接嘗試print()
一個Person
,我們將得到相同的結果。 所以打印名字的循環不再需要print(person.show_name())
,它可以簡單地print(person)
——這對我來說似乎更具可讀性,而且更短一點!
所以,總結一下,一切看起來像這樣:
class Person:
name: str
gender: str
def __new__(cls):
cls.name = input('Name: ')
if cls.name:
cls.gender = input('Gender: ')
return super(Person, cls).__new__(cls)
else:
raise ValueError("A name is required to create a Person instance")
def __init__(self):
self.name = Person.name
self.gender = Person.gender
def __str__(self):
return f"{self.name} is {self.gender}"
def main():
people = []
while True:
try:
new_person = Person()
except ValueError:
break
else:
people.append(new_person)
for person in people:
print(person)
if __name__ == "__main__":
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.