对对象的操作会对其他人进行更改

时间:2016-12-22 18:48:32

标签: arrays python-3.x

我需要一点解释。对一个对象的操作会对其他对象进行更改,例如:

aa = Classifier("aa")
bb = Classifier("bb")

aa.print_table()
{1: 6, 2: 26}

bb.print_table()
{1: 6, 2: 26}

aa.addValue(3)

bb.print_table()
{1: 6, 2: 26, 3: 1}

以下是我班级的一部分:

class Classifier:

classTable = {1:0} 
default = 0
classTable_size = 0
def __init__(self, q):
    a = 1
    self.name = q

def addValue(self, i_index):
    self.classTable.setdefault(i_index, self.default)
    self.classTable[i_index] += 1
    self.classTable_size += 1

def print_table(self):
    print(self.classTable)

如果我在类的顶部定义变量(在这种情况下在构造函数之前),它将使它成为"静态"或者我班上有错误?我正在考虑以这种方式定义变量,使它们只能从自己的对象中获得。

我是python的新手。

1 个答案:

答案 0 :(得分:0)

示例:

class A:

    data = {}

    def __str__(self):
        return str(self.data)

class B:

    data = {}

    def __init__(self):

        self.data = {'B': 5}

    def __str__(self):
        return str(self.data)

在班级A中,一个实例本身并不拥有data;它是静态的'并且可以使用self.data以及A.data访问(这是python在对象中查找变量的方式:如果self.data不存在,python将查找A.data) ;两者都引用相同的字典。对self.data(或A.data)的更改将影响所有实例:

a = A()
a.data.update({'A': 3})
print(a)  # -> {'A': 3}
aa = A()
print(aa)  # ->  {'A': 3}

除非您为实例添加新的data成员;这个只属于实例:

aa.data = {}  # data references now this empty dict and not A.data anymore
print(a)  # -> {}
print(aa) # -> {'A': 3}

class B中,每个实例都会在'构造函数中获得自己的新dict。 __init__ - 即使有静态的' data成员。一个实例中的更改不会影响其他实例。 self.data现在是与B.data不同的对象。

通常,拥有一个具有相同名称的类变量(B.data)和一个实例变量(self.data)是个坏主意...

也许this值得一读。并且有关于python的更多信息......