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
。
私は何が欠けていますか?クラス レベル変数を誤って変更しようとしていますか?