Berikut adalah cara untuk menghindari anggapan itu
semua pengguna menyetujui orang dewasa, dan dengan demikian bertanggung jawab untuk menggunakan berbagai hal dengan benar.
silakan lihat pembaruan saya di bawah ini
Menggunakan @property
, sangat bertele-tele misalnya:
class AClassWithManyAttributes:
'''refactored to properties'''
def __init__(a, b, c, d, e ...)
self._a = a
self._b = b
self._c = c
self.d = d
self.e = e
@property
def a(self):
return self._a
@property
def b(self):
return self._b
@property
def c(self):
return self._c
Menggunakan
Tanpa garis bawah: ini adalah variabel publik.
Satu garis bawah: ini adalah variabel yang dilindungi.
Dua garis bawah: ini adalah variabel privat.
Kecuali yang terakhir, ini konvensi. Anda masih dapat, jika benar-benar berusaha keras, mengakses variabel dengan garis bawah ganda.
Jadi apa yang kita lakukan? Apakah kita menyerah untuk memiliki properti hanya baca di Python?
Melihat! read_only_properties
dekorator untuk menyelamatkan!
@read_only_properties('readonly', 'forbidden')
class MyClass(object):
def __init__(self, a, b, c):
self.readonly = a
self.forbidden = b
self.ok = c
m = MyClass(1, 2, 3)
m.ok = 4
print(m.ok, m.readonly)
print("This worked...")
m.forbidden = 4
Anda bertanya:
Dari mana read_only_properties
asalnya
Senang Anda bertanya, berikut adalah sumber read_only_properties :
def read_only_properties(*attrs):
def class_rebuilder(cls):
"The class decorator"
class NewClass(cls):
"This is the overwritten class"
def __setattr__(self, name, value):
if name not in attrs:
pass
elif name not in self.__dict__:
pass
else:
raise AttributeError("Can't modify {}".format(name))
super().__setattr__(name, value)
return NewClass
return class_rebuilder
memperbarui
Saya tidak pernah menyangka jawaban ini akan mendapat banyak perhatian. Anehnya memang begitu. Ini mendorong saya untuk membuat paket yang dapat Anda gunakan.
$ pip install read-only-properties
di shell python Anda:
In [1]: from rop import read_only_properties
In [2]: @read_only_properties('a')
...: class Foo:
...: def __init__(self, a, b):
...: self.a = a
...: self.b = b
...:
In [3]: f=Foo('explodes', 'ok-to-overwrite')
In [4]: f.b = 5
In [5]: f.a = 'boom'
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-a5226072b3b4> in <module>()
----> 1 f.a = 'boom'
/home/oznt/.virtualenvs/tracker/lib/python3.5/site-packages/rop.py in __setattr__(self, name, value)
116 pass
117 else:
--> 118 raise AttributeError("Can't touch {}".format(name))
119
120 super().__setattr__(name, value)
AttributeError: Can't touch a
self.x
dan percaya bahwa tidak ada yang akan berubahx
. Jika memastikan bahwax
tidak dapat diubah itu penting, gunakan properti.