我遇到了一个问题,这个问题可能很简单,但我还是搞不清楚。我正在尝试开发一个桌面应用程序来创建时间表。我使用的是Tkinter和Python 3.6。我有一个教师类,所以用户可以创建具有各种属性的新实例。
class Teacher:
"""The properties of the teachers"""
allTeachers = []
def __init__(self, name, lessons, timeframe):
self.name = name
Teacher.allTeachers.append(self.name)
self.lessons = lessons # number of lessons
self.timeframe = timeframe
一旦创建了一个新实例,我就会检查它是否存在:
for obj in gc.get_objects():
if isinstance(obj, Teacher):
print(obj.name)
但是,当用户添加另一个教师时,上面的代码表明教师类仍然只有一个实例(最新的一个)。此外,当我从另一个模块(在相同的目录中)运行相同的代码时,Python告诉我教师类没有实例。尽管如此,class变量(allTeachers)会跟踪添加的所有教师。
我是否遗漏了一些关于访问对象的基本信息?
发布于 2018-07-22 17:54:58
如果您不持有对实例的任何引用,则Python将释放内存。您只存储教师的姓名,而不是它的实例。所以如果你碰巧像这样创建它们:
Teacher("Hugo", None, "8am to 2pm")
Teacher("Claas", "some", "9am to 10am")
没有对实际实例的引用,它们会被垃圾回收。
此外,还可以在此处阅读信息:Python garbage collector documentation
改用O(1)的set
或dict
。如果您想按名称查找Teacher
,dict
会很方便:
class Teacher:
"""The properties of the teachers"""
allTeachers = {} # dict as lookup is faster then list for 4+ teachers
def __init__(self, name, lessons, timeframe):
self.name = name
Teacher.allTeachers[self.name] = self # store the instance under its name
self.lessons = lessons # number of lessons
self.timeframe = timeframe
@classmethod
def hasTeacher(cls,name):
return name in Teacher.allTeachers
Teacher("Hugo", None, "8am to 2pm")
Teacher("Claas", "some", "9am to 10am")
import gc
print(Teacher.hasTeacher("Judith"))
print(Teacher.hasTeacher("Claas"))
for obj in gc.get_objects():
if isinstance(obj, Teacher):
print(obj.name)
输出:
False # no teacher called Judith
True # a teacher called Claas
# all the Teacher instances
Hugo
Claas
如果您以这种方式存储教师实例,那么您可能还应该提供一种方法来按名称将它们从类变量实例中删除-并且可以从其中按名称返回Teacher
-instance
https://stackoverflow.com/questions/51463741
复制相似问题