我解决了这个问题:
开发可与以下类型一起运行的应用程序:Person
(字段Name
,方法ShowData()
)Student
(字段Education
)Worker
(字段WorkPlace
)
类Student
和Worker
派生自类Person
。
容器中的类Academy
收集Students
和Workers
并为方法Name
中的所有人显示Education
,WorkPlace
或ShowAll()
。
我们可以通过调用方法Academy
向AddPerson()
添加新人员。
哪个班级最好
解决这个问题?
代码应包括继承和使用集合。
这是我的解决方案,但我不知道如何实现方法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
我想在这里不再赘述,因为我想您有一位老师,您可以询问更多我的评论。但是至少您尝试过,犯了一些错误(错误是好的!)。但是我没有给您完整的答案,我在这里的唯一目标是使您以正确的心态建立起来,以使您的代码成为更好的设计!
我希望这有帮助!