簡體   English   中英

Python理解OOP,繼承

[英]Python understanding OOP, inheritance

我解決了這個問題:

開發一個適用於以下類型的應用程序:

  1. Person (字段Name ,方法ShowData()
  2. Student (實地Education
  3. Worker (場WorkPlace

StudentWorker派生自Person類。

Academy在它的容器收集StudentsWorkers ,並顯示NameEducationWorkPlace中的方法所有人ShowAll()

我們可以通過調用方法AddPerson()將新人添加到Academy

哪個類的層次結構最適合解決這個問題?

代碼應包括繼承和使用集合。

這是我的解決方案,但我不知道如何實現方法AddPerson

class Academy(object):
    theWholeList = []
    @staticmethod
    def showAll():
        for obj in Academy.theWholeList:
            if isinstance(obj,Student):
                print obj.name+' - '+obj.edu
            elif isinstance(obj,Worker):
                print obj.name+' - '+obj.wplace

class Person(Academy):
    def __init__(self,name):
        self.name = name
        super(Person, self).theWholeList.append(self)

    def showData(self):
        return vars(self)

class Student(Person):

    def __init__(self, name, edu):
        super(Student, self).__init__(name)
        self.edu = edu

class Worker(Person):

    def __init__(self, name, wplace):
        super(Worker, self).__init__(name)
        self.wplace = wplace

也許Academy必須繼承Person和方法AddPerson將是這樣的:

def add(self,name):
    super(Academy,self).__init__(name)

第一件事:

class Academy(object):
    theWholeList = []
    @staticmethod
    def showAll():
        for obj in Academy.theWholeList:
            if isinstance(obj,Student):
                print obj.name+' - '+obj.edu
            elif isinstance(obj,Worker):
                print obj.name+' - '+obj.wplace

你不需要Academy的方法showAll()是一個靜態的方法,因為在你的設計中,學院是合法的單身,即一個具有單個實例的類。

此外, theWholeList是列表的一個非常糟糕的名稱。 因為你知道它是一個列表,因為你要為它分配一個列表。 名稱應描述其語義,即它包含的東西的種類,它的用途。

你應該按如下方式重寫它:

class Academy:
    def __init__(self):
        self.person_list = []

    def show_all(self):
        for item in self.person_list:
            item.show_data()

而且你會一次實現它:

學院=學院()

然后是以下內容:

class Person(Academy):
    def __init__(self,name):
        self.name = name
        super(Person, self).theWholeList.append(self)

糟糕的設計:在面向對象的編程中,你應該考慮封裝數據。 在這里,你正在做的假設Person知道的內部Academy 如果您決定更改Academy的實現以便重命名theWholeList ,該怎么辦? 或者切換成dict() 這應該對班級Academy的“用戶”透明。 更好的設計應該是:

class Academy:
    ... # cf earlier

    def add_person(self, person):
        self.person_list.append(person)

class Person(Academy):
    def __init__(self,name):
        self.name = name

    def show_data(self):
        print("My name is: {}".format(name))

所以你可以按如下方式使用它:

person_a = Person("John Doe")
person_b = Person("Jim Smith")
academy.add_person(person_a)
academy.add_person(person_b)

最后你想知道:

也許學院必須繼承人

大多數時候,子類化是錯誤問題的錯誤答案。 當您想要擴展專門化類的行為時,您需要子類。 一個經典的例子是:

class Animal:
    def noise(self):
        raise NotImplementedError # virtual method

class Duck(Animal):
    def noise(self):
        print("quack")

class Cat(Animal):
    def noise(self):
        print("meaw")

所以在你的情況下,你有一個實現show_data的類人,你想要的是為工人和學生擴展行為:

class Worker(Person): # a worker _is_ a person!
    def __init__(self, name, unit):
        # left as an exercise to the OP

    def show_data(self):
        # left as an exercise to the OP

class Student(Person):
    def __init__(self, name, promo):
        # left as an exercise to the OP

    def show_data(self):
        # left as an exercise to the OP

我不會在這里得到更多細節,因為我想你有一位老師,你可以更多地詢問我所做的評論。 但至少你試過,犯了一些錯誤(並且錯誤很好!)。 但是我沒有給你一個完整的答案,我唯一的目標是讓你在正確的思維定下讓你的代碼變得更好!

我希望這有幫助!

您希望能夠添加人員:

>>> academy = Academy()
>>> academy.add(Person('Pete'))
>>> academy.showAll()
Name: Pete

>>> academy.add(Student('Taras', 'Higher'))
>>> academy.showAll()
Name: Pete
Name: Taras, Education: Higher

>>> academy.add(Worker('riotburn', 'StackOverflow')
>>> academy.showAll()
Name: Pete
Name: Taras, Education: Higher
Name: riotburn, Workplace: StackOverflow

showAll需要迭代調用ShowData所有人。 對於每種類型,這將以不同方式實現。

class Academy(object):
    def __init__(self):
        self.people = []

    def add(self, person):
        self.people.append(person)

    def showAll(self):
        for person in self.people:
            person.ShowData()

例如, Worker將實現ShowData

def ShowData(self):
    print 'Name: ' + self.name + ', Education:' + self.edu

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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