首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python -无法访问类的实例

Python -无法访问类的实例
EN

Stack Overflow用户
提问于 2018-07-22 17:31:26
回答 1查看 226关注 0票数 3

我遇到了一个问题,这个问题可能很简单,但我还是搞不清楚。我正在尝试开发一个桌面应用程序来创建时间表。我使用的是Tkinter和Python 3.6。我有一个教师类,所以用户可以创建具有各种属性的新实例。

代码语言:javascript
复制
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

一旦创建了一个新实例,我就会检查它是否存在:

代码语言:javascript
复制
for obj in gc.get_objects():
    if isinstance(obj, Teacher):
        print(obj.name)

但是,当用户添加另一个教师时,上面的代码表明教师类仍然只有一个实例(最新的一个)。此外,当我从另一个模块(在相同的目录中)运行相同的代码时,Python告诉我教师类没有实例。尽管如此,class变量(allTeachers)会跟踪添加的所有教师。

我是否遗漏了一些关于访问对象的基本信息?

EN

回答 1

Stack Overflow用户

发布于 2018-07-22 17:54:58

如果您不持有对实例的任何引用,则Python将释放内存。您只存储教师的姓名,而不是它的实例。所以如果你碰巧像这样创建它们:

代码语言:javascript
复制
Teacher("Hugo", None, "8am to 2pm")
Teacher("Claas", "some", "9am to 10am")

没有对实际实例的引用,它们会被垃圾回收。

此外,还可以在此处阅读信息:Python garbage collector documentation

改用O(1)的setdict。如果您想按名称查找Teacherdict会很方便:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
False  # no teacher called Judith
True   # a teacher called Claas

# all the Teacher instances
Hugo
Claas

如果您以这种方式存储教师实例,那么您可能还应该提供一种方法来按名称将它们从类变量实例中删除-并且可以从其中按名称返回Teacher-instance

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51463741

复制
相关文章

相似问题

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