在收到关于我的前一个问题的反馈后,我决定再试一个项目,看看我是否理解O.O.P.。这个想法也是基于我这个学期正在做的项目--我的课堂上的互动学校巡回演出。
这个程序让你做了一堆老师的例子,然后把它们全部打印出来。
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.方法是否有什么问题,因为我对自己正在做的事情仍然知之甚少。
发布于 2020-03-02 21:51:53
Teacher类的用户应该能够在设置name、subject和room_number属性之后修改它们吗?如果不是,则将_放在这些名称的开头,将其设置为私有。__repr__,它将它们转换为用于打印的字符串。这将是一个很好的地方放置您的格式逻辑。globals会做些什么,但一般情况下,您不应该碰globals。instagator函数说它创建了一个Teacher,但是它也接受了一个现有教师的列表,并将其附加到其中,然后返回它。试着让你的函数做一件显而易见的事情,而不是做多个不明显的事情。如果您的instagator函数只执行它说的一件事情(创建一个Teacher),并且如果您将字符串格式移动到__repr__函数中,而不是有一个中间print_info实际上不打印任何东西,那么代码就变得简单了一些:
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,这将自动转换为我想要的格式化字符串。
我不认为为用户输入提供构造函数提示符通常不是很好的实践,但对于这样的实践练习,我认为演示如何使用类封装与构建对象相关的所有逻辑是可以的:
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)https://codereview.stackexchange.com/questions/238271
复制相似问题