2016-09-24 154 views
1

所以我正在用Python编写一个程序,它将把我所有的大学课程(来自csv)以及有关它们的打印信息。我写了一个简单的课Subject来更好地管理一切。在我的单身中,甚至几周,几周和每周都有课,我有讲课,练习和实验室。所以我的主题类是这样的:Python类初始化 - 属性内存

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 

以前我曾写在even所有日子,oddall类型的字典,像这样:

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

所以我所有的课小时内添加到特定一天的钥匙。但是有一个问题。例如,可以说编程讲座是主题1,编程实验室是主题2.主题1是在周一的9.15。对象2也在星期一,但是在17.05。所以我有一个功能,它可以检查主题是偶数/星期还是每周。然后我会在主题1上分配f.e 9.15到even["mon"]。然后我会去找主题2,并尝试将17.05加到even["mon"]。每个主题都是存储在列表中的其他Subject类对象。但是有一个错误。当我试图添加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像记住写入第一个对象属性的东西呢?

回答

0

您需要声明__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__方法中声明它们可确保每次创建对象的新实例时都会创建一个新的成员实例。

+0

因此,在init方法之上创建属性是一种不好的做法吗? – FrynioS

+0

是的,您不需要那样做,除非您希望这些变量在课程的所有实例中共享。 – user3543300

+0

谢谢,现在我很清楚 – FrynioS