[英]Python understanding OOP, inheritance
我解決了這個問題:
開發一個適用於以下類型的應用程序:
Person
(字段Name
,方法ShowData()
) Student
(實地Education
) Worker
(場WorkPlace
) 類Student
和Worker
派生自Person
類。
類Academy
在它的容器收集Students
和Workers
,並顯示Name
, Education
或WorkPlace
中的方法所有人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.