Helo, selepas mengkaji isu ini sebentar, saya sampai pada kesimpulan:
Terlalu sukar untuk dilakukan dan sintaks yang anda mahu gunakan tidak sepadan dengan apa yang anda cuba lakukan
Saya rasa tiada salahnya menggunakan kaedah asal
Jika anda ingin mencapai pertukaran yang anda tentukan, maka saya ada alternatif yang tidak terlalu cantik, anda boleh rujuk
Berikut ialah penjelasan mengenai tiga perkara di atas:
Untuk mata pertama, anda mahu:
db1, db2 = db2, db1
Tidak kira apa jenis objek db1, db2, maksud pertukaran ini ialah
Biarkan pembolehubah db1 merujuk kepada objek yang asalnya dirujuk oleh db2 dan biarkan pembolehubah db2 merujuk kepada objek yang asalnya dirujuk oleh db1.
Tetapi apa yang anda mahu lakukan ialah:
Biarkan kandungan db1 fail dan db2 fail ditukar ganti
Fikirkan dengan teliti, kedua-dua perkara ini tidak sama, db1, db2 = db2, db1 hanya akan membuat perkara yang dirujuk oleh pembolehubah bertukar (nama pembolehubah tidak sama dengan nama fail db) , tetapi nama setiap fail Kandungan masih tidak ditukar.
Jadi menggunakan sintaks ini untuk bertukar adalah tidak konsisten dengan kesan yang anda ingin capai.
Saya tidak akan menghuraikan perkara kedua kerana ia munasabah, tetapi anda mungkin tidak menyukainya.
Mata ketiga yang saya berikan ialah alternatif yang kurang cantik, iaitu dengan mentakrifkan kelas proksi shelf daripada ShelfProxy Kelas ini cuba mensimulasikan kelakuan kelas Shelf (hanya antara muka yang serupa) , dan Operator terbeban ^ ditakrifkan sebagai pertukaran:
import shelve
class ShelfProxy:
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self.file = args[0]
self.loaddb()
@classmethod
def open(cls, *args, **kwargs):
return cls(*args, **kwargs)
def __getattr__(self, name):
return getattr(self.dic, name)
def __setitem__(self, name, value):
self.dic[name] = value
def __getitem__(self, name):
return self.dic[name]
def __xor__(self, other):
self.dic, other.dic = other.dic, self.dic
return True
def __str__(self):
return str(self.dic)
def loaddb(self):
db = shelve.open(*self.args, **self.kwargs)
self.dic = dict(db.items())
db.close()
def close(self):
newdb = shelve.open(self.file, *self.args[1:], **self.kwargs)
for key in newdb.keys():
del newdb[key]
for key, value in self.dic.items():
newdb[key] = value
newdb.close()
Saya mentakrifkan ^ sebagai pertukaran kandungan dalam Sebab mengapa saya memilih ^ hanya kerana saya tidak dapat memikirkan simbol yang lebih sesuai Secara umumnya, beban berlebihan tidak akan berlaku dilakukan dengan cara ini, dan ia tidak begitu mudah untuk kelas lain akan dikembalikan, tetapi saya membuat ini untuk kemudahan dan kerana anda mahukan antara muka yang mudah.
Kebanyakan masa, anda boleh menggunakan antara muka yang sama seperti Shelf untuk mengendalikan ShelfProxy, dan kesan keseluruhannya adalah serupa, tetapi tidakkah anda fikir lebih mudah untuk menggunakan kaedah dari awal selepas menulis begitu banyak ? XD
Helo, selepas mengkaji isu ini sebentar, saya sampai pada kesimpulan:
Terlalu sukar untuk dilakukan dan sintaks yang anda mahu gunakan tidak sepadan dengan apa yang anda cuba lakukan
Saya rasa tiada salahnya menggunakan kaedah asal
Jika anda ingin mencapai pertukaran yang anda tentukan, maka saya ada alternatif yang tidak terlalu cantik, anda boleh rujuk
Berikut ialah penjelasan mengenai tiga perkara di atas:
Untuk mata pertama, anda mahu:
Tidak kira apa jenis objek
db1
,db2
, maksud pertukaran ini ialahTetapi apa yang anda mahu lakukan ialah:
Fikirkan dengan teliti, kedua-dua perkara ini tidak sama,
db1, db2 = db2, db1
hanya akan membuat perkara yang dirujuk oleh pembolehubah bertukar (nama pembolehubah tidak sama dengan nama fail db) , tetapi nama setiap fail Kandungan masih tidak ditukar.Jadi menggunakan sintaks ini untuk bertukar adalah tidak konsisten dengan kesan yang anda ingin capai.
Saya tidak akan menghuraikan perkara kedua kerana ia munasabah, tetapi anda mungkin tidak menyukainya.
Mata ketiga yang saya berikan ialah alternatif yang kurang cantik, iaitu dengan mentakrifkan kelas proksi
shelf
daripadaShelfProxy
Kelas ini cuba mensimulasikan kelakuan kelasShelf
(hanya antara muka yang serupa) , dan Operator terbeban^
ditakrifkan sebagai pertukaran:Saya mentakrifkan
^
sebagai pertukaran kandungan dalam Sebab mengapa saya memilih^
hanya kerana saya tidak dapat memikirkan simbol yang lebih sesuai Secara umumnya, beban berlebihan tidak akan berlaku dilakukan dengan cara ini, dan ia tidak begitu mudah untuk kelas lain akan dikembalikan, tetapi saya membuat ini untuk kemudahan dan kerana anda mahukan antara muka yang mudah.Kemudian kami mentakrifkan beberapa fungsi ujian:
Kod ujian:
Keputusan:
Kesimpulan
Kebanyakan masa, anda boleh menggunakan antara muka yang sama seperti
Shelf
untuk mengendalikanShelfProxy
, dan kesan keseluruhannya adalah serupa, tetapi tidakkah anda fikir lebih mudah untuk menggunakan kaedah dari awal selepas menulis begitu banyak ? XDSoalan yang saya jawab: Python-QA