我解决了这个问题:

开发可与以下类型一起运行的应用程序:


Person(字段Name,方法ShowData()
Student(字段Education
Worker(字段WorkPlace


StudentWorker派生自类Person

容器中的类Academy收集StudentsWorkers并为方法Name中的所有人显示EducationWorkPlaceShowAll()

我们可以通过调用方法AcademyAddPerson()添加新人员。

哪个班级最好
解决这个问题?

代码应包括继承和使用集合。

这是我的解决方案,但我不知道如何实现方法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


我想在这里不再赘述,因为我想您有一位老师,您可以询问更多我的评论。但是至少您尝试过,犯了一些错误(错误是好的!)。但是我没有给您完整的答案,我在这里的唯一目标是使您以正确的心态建立起来,以使您的代码成为更好的设计!

我希望这有帮助!

08-03 12:23