首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不,老师名单

不,老师名单
EN

Code Review用户
提问于 2020-03-02 21:29:22
回答 1查看 885关注 0票数 8

在收到关于我的前一个问题的反馈后,我决定再试一个项目,看看我是否理解O.O.P.。这个想法也是基于我这个学期正在做的项目--我的课堂上的互动学校巡回演出。

这个程序让你做了一堆老师的例子,然后把它们全部打印出来。

代码语言:javascript
复制
class Teacher:
    def __init__(self, name, subject, room_number):
        self.name = name
        self.subject = subject
        self.room_number = room_number
    def print_info(self):
        return self.name, self.subject, self.room_number


def instagator(teachers: list) -> list:
    """Creates a version of the teacher class"""
    print("")
    name = input("Please enter a teachers name: ")
    subject = input("Please enter that teachers subject: ")
    room_number = input("Please enter what room that teacher teaches in: ")
    # Makes the varible that holds the instance names after the teacher
    globals()[name] = Teacher(name, subject, room_number)
    teachers.append(globals()[name])
    return teachers


teachers = []
print("Please enter the name of 10 teachers, the subject they teach, and the room they teach that subject in.")
for _ in range(10):
    teachers = instagator(teachers)
print("\n")
for teacher in teachers:
    info = teacher.print_info()
    print(f"{info[0].capitalize()} teaches {info[1]} in room {info[2]}. \n")

和以前一样,我只想知道我的O.P.方法是否有什么问题,因为我对自己正在做的事情仍然知之甚少。

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-03-02 21:51:53

  1. 您的Teacher类的用户应该能够在设置namesubjectroom_number属性之后修改它们吗?如果不是,则将_放在这些名称的开头,将其设置为私有。
  2. Python有一个神奇的方法__repr__,它将它们转换为用于打印的字符串。这将是一个很好的地方放置您的格式逻辑。
  3. 我不知道globals会做些什么,但一般情况下,您不应该碰globals
  4. 您的instagator函数说它创建了一个Teacher,但是它也接受了一个现有教师的列表,并将其附加到其中,然后返回它。试着让你的函数做一件显而易见的事情,而不是做多个不明显的事情。

如果您的instagator函数只执行它说的一件事情(创建一个Teacher),并且如果您将字符串格式移动到__repr__函数中,而不是有一个中间print_info实际上不打印任何东西,那么代码就变得简单了一些:

代码语言:javascript
复制
class Teacher:
    def __init__(self, name: str, subject: str, room_number: str):
        self._name = name
        self._subject = subject
        self._room_number = room_number

    def __repr__(self) -> str:
        return f"{self._name.capitalize()} teaches {self._subject} in room {self._room_number}."


def instagator() -> Teacher:
    """Creates a Teacher from user input."""
    print("")
    name = input("Please enter a teachers name: ")
    subject = input("Please enter that teachers subject: ")
    room_number = input("Please enter what room that teacher teaches in: ")
    return Teacher(name, subject, room_number)


print("Please enter the name of 10 teachers, the subject they teach, and the room they teach that subject in.")
teachers = [instagator() for _ in range(10)]
print("\n")

for teacher in teachers:
    print(teacher)

注意,由于instagator返回一个Teacher,所以我可以使用一个简单的列表理解来构建所有Teachers的列表,其中一个对应于range中的每个数字。由于我实现了__repr__,所以我不需要多行代码来构建要打印的字符串;我可以直接打印teacher,这将自动转换为我想要的格式化字符串。

我不认为为用户输入提供构造函数提示符通常不是很好的实践,但对于这样的实践练习,我认为演示如何使用类封装与构建对象相关的所有逻辑是可以的:

代码语言:javascript
复制
class Teacher:
    def __init__(self):
        """Creates a Teacher from user input."""
        print("")
        self._name = input("Please enter a teachers name: ")
        self._subject = input("Please enter that teachers subject: ")
        self._room_number = input("Please enter what room that teacher teaches in: ")

    def __repr__(self) -> str:
        return f"{self._name.capitalize()} teaches {self._subject} in room {self._room_number}."


print("Please enter the name of 10 teachers, the subject they teach, and the room they teach that subject in.")
teachers = [Teacher() for _ in range(10)]
print("\n")

for teacher in teachers:
    print(teacher)
票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/238271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档