【问题标题】:Accessing a Single Variable from Another Class (Python)从另一个类访问单个变量 (Python)
【发布时间】:2020-05-13 04:14:07
【问题描述】:

所以,我无法弄清楚如何最好地构建我的 Python 代码。我有一个使用类的简短程序,我在下面的示例中重新创建了它:

prof1 = Professor()
prof2 = Professor()
professor_list = [prof1, prof2]

class Professor:
  def __init__(self):
    self.name = ""
    self.department = ""
    self.course = ""
    self.students = []

class Student:
  def __init__(self):
    self.name = ""
    self.activities = []

所以基本上,我有一个对象列表,它们是Professor 类的实例。每个 Professor 对象还包含一个 Student 对象列表,每个对象都是 Student 类的一个实例。我希望每个学生也能够从其对应的教授(列表中包含该学生的教授对象)访问course 变量,但我不确定最简洁的方法是什么。

我考虑让StudentProfessor 继承,但这似乎很草率,因为我实际上并不想从Professor 继承所有变量和功能。比如Professor的department变量跟一个Student对象没有关系,我不希望Student有一个department属性。此外,学生不是教授的子类型,我认为这是与继承相关的。

我还想过手动将课程信息作为属性添加到每个学生,但这似乎也不正确。在我想要的结构中,课程将是教授的独特属性,并且各种学生将与教授相关联。所有需要访问 course 变量的学生都在教授的学生列表中 - 所以难道不应该有一种比手动添加给每个学生更简洁的方法让他们使用它吗?

这里还有一个想法:我可能会在每个Student 中包含对相应Professor 类的引用,并以这种方式访问​​变量。这是不好的做法吗?

非常感谢您对此提供的任何帮助。

【问题讨论】:

    标签: python-3.x class inheritance


    【解决方案1】:

    您可以参考Professor,但我认为最简单的方法是创建一个add_student 方法,将Student 也添加到相应的Professor 列表中as 在Student 上标记课程,因此您不必手动执行此操作,并且可以避免循环引用(这也是不必要的,因为如果您在Student 上标记Professor 引用只是为了获取course属性,那么你也可以直接标记course属性):

    class Professor:
      def __init__(self):
        self.name = ""
        self.department = ""
        self.course = ""
        self.students = []
    
      def add_student(self, student):
        self.students.append(student)
        student.course = self.course
    
    class Student:
      def __init__(self):
        self.name = ""
        self.activities = []
        self.course = None
    

    或者,您可以向Professor 添加一个方法来检查Student 是否属于它并使用它来获取课程:

    prof1 = Professor()
    prof2 = Professor()
    professor_list = [prof1, prof2]
    
    class Professor:
      def __init__(self):
        self.name = ""
        self.department = ""
        self.course = ""
        self.students = []
    
      def teaches(self, student):
        return student in self.students
    
    class Student:
      def __init__(self):
        self.name = ""
        self.activities = []
    
      def get_course(self, professors):
        for professor in professors:
          if professor.teaches(self):
            return professor.course
    
        return None
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多