【问题标题】:Python class initialization - attributes memoryPython类初始化-属性内存
【发布时间】:2016-09-24 00:55:20
【问题描述】:

所以我在 Python 中编写了一个程序,它将获取我所有的大学课程(来自 csv)并打印有关它们的信息。我写了一个简单的类Subject 来更好地管理一切。在我的大学里,有偶数周、奇数周和每周课程,我有讲座、练习和实验室。所以我的主题课是这样的:

class Subject:
    number = 0
    name = ""
    dummyData = []
    even = {}
    odd = {}
    all = {}
    type = ""
    def __init__(self, name, number, type):
        self.name = name
        self.number = number
        self.type = type
        self.info = str(number) + " " + name + " " + type

以前我整天都用evenoddall dicts 写,像这样:

even = {"mon":"",
                "tue":"",
                "wed":"",
                "thu":"",
                "fri":"",
        }

所以我可以将所有课程时间添加到特定日期键。但是有一个问题。例如,假设编程讲座是主题 1,编程实验室是主题 2。主题 1 是星期一 9.15。主题 2 也是在星期一,但在 17.05。所以我有一个功能,可以检查主题是在偶数周还是奇数周还是每周。然后我会将 f.e 9.15 分配给主题 1 的 even["mon"]。然后我会选择主题 2,并尝试将 17.05 添加到 even["mon"]。每个主题都是存储在列表中的另一个主题类对象。但是有一个错误。当我尝试将 17.05 添加到主题 2s even["mon"] 时,它添加了它,好吧,但是 even["mon"] 应该是 ="17.05",但它是 ="9.15/17.05"。我试图找出问题所在,我终于做到了,通过改变我的课程:

class Subject:
    number = 0
    name = ""
    dummyData = []
    even = {"mon":"",
                "tue":"",
                "wed":"",
                "thu":"",
                "fri":"",
        }
    ...etc...
    type = ""
    def __init__(self, name, number, type):
        self.name = name
        self.number = number
        self.type = type
        self.info = str(number) + " " + name + " " + type

到:

class Subject:
    number = 0
    name = ""
    dummyData = []
    even = {}
    odd = {}
    all = {}
    type = ""
    def __init__(self, name, number, type):
        self.name = name
        self.number = number
        self.type = type
        self.info = str(number) + " " + name + " " + type
        self.even = {"mon":"",
                "tue":"",
                "wed":"",
                "thu":"",
                "fri":"",
        }

+ 奇数。那么为什么 Python 喜欢记住写入第一个对象属性的内容呢?

【问题讨论】:

    标签: python class initialization


    【解决方案1】:

    您需要在__init__ 方法中声明属性。这是一个例子

    class Subject:
        def __init__(self, name, number, type):
           self.number = number
           self.name = name
           self.dummyData = []
           self.even = {}
           self.odd = {}
           self.all = {}
           self.type = type
    

    在类声明中声明变量使它们成为“类”成员而不是实例成员。在 __init__ 方法中声明它们可以确保每次创建对象的新实例时都会创建成员的新实例。

    【讨论】:

    • 那么在init方法之上设置属性是不是一种不好的做法?
    • 是的,您不需要这样做,除非您希望在类的所有实例之间共享这些变量。
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2011-12-03
    • 2021-11-21
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2022-01-20
    相关资源
    最近更新 更多