簡體   English   中英

如何使用 class 和方法打印姓名和性別?

[英]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_namegive_gendershow_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM