我不明白 Python 中的“静态”类数据是如何工作的。我正在尝试复制我在 Java 中经常使用的模式,在该模式中我创建了一个中央仿数据库类,并将它的实例提供给任何需要它的类。
但是,这就是我迷失 Python 的地方,似乎每当我尝试访问“静态”变量时,我都会创建一个实例级别的实例。这很令人困惑。
这是代码:
import csv
class Database(object):
data = list()
def __init__(self):
pass
def connect(self, location=None):
path = '.\\resources\\database\\'
with open(path + 'info.csv', 'rU') as f:
csv_data = csv.reader(f, delimiter=',')
for row in csv_data:
self.data.append(Entry(*row))
如您所见,非常简单。我data
在 之外声明init
,我相信这使它成为类级别。然后我遍历一个 csv 文件并将每一行的单元格字段附加到data
列表中。
这就是我感到困惑的地方。我想做的第一件事是对data
列表中的第一个条目进行切片(这只是从 excel 表中命名的列)。但在这样做时,它似乎创建了一个实例级别版本,data
而不是修改data
我想要的类级别。
所以,我修改了代码如下
import csv
class Database(object):
data = list()
def __init__(self):
pass
def connect(self, location=None):
path = '.\\resources\\database\\'
with open(path + 'info.csv', 'rU') as f:
csv_data = csv.reader(f, delimiter=',')
for row in csv_data:
self.data.append(Entry(*row))
self.data = self.data[1:] ## <--- NEW LINE HERE
如您所见,我尝试像对任何其他列表一样对其进行切片,但这样做时,它(似乎)成为了本地版本data
在我的main()
中,我有以下代码来测试一些属性:
def main():
settings = Settings()
db = csv_loader.Database()
db.connect(settings.database)
print 'gui.py:', db.data[0].num
print 'gui.py:', db.data[0].name
print 'gui.py:', len(db.data)
这与预期的一样。由于之前的切片操作,它有 143 个条目。
现在,我有另一个类,它有一个实例,Database()
但切片没有效果。
self.db = Database()
self.settings = Settings()
print 'tabOne.py:', self.db.data[0].conf_num
print 'tabOne.py:', self.db.data[0].conf_name
print len(self.db.data)
该类的打印输出显示列表中有 144 个元素——因此切片操作实际上并未修改类级别data
。
我错过了什么?我是在尝试错误地修改类级别变量还是什么?