ধারণাটি এড়াতে এখানে একটি উপায়
সমস্ত ব্যবহারকারীরা প্রাপ্তবয়স্কদের সম্মতি দিচ্ছেন এবং এইভাবে তারা নিজেরাই জিনিসগুলি সঠিকভাবে ব্যবহারের জন্য দায়বদ্ধ।
নীচে আমার আপডেট দেখুন
ব্যবহার @property
করা খুব ভার্জোজ যেমন:
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
ব্যবহার
কোন আন্ডারস্কোর নয়: এটি সর্বজনীন পরিবর্তনশীল।
একটি আন্ডারস্কোর: এটি একটি সুরক্ষিত পরিবর্তনশীল।
দুটি আন্ডারস্কোর: এটি একটি প্রাইভেট ভেরিয়েবল।
শেষটি ব্যতীত, এটি একটি সম্মেলন। আপনি এখনও চেষ্টা করতে পারেন, যদি আপনি সত্যিই চেষ্টা করেন তবে ডাবল আন্ডারস্কোর সহ ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন।
তাই আমরা কি কাজ করতে পারি? আমরা কি পাইথনে কেবলমাত্র বৈশিষ্ট্যগুলি পড়ার বিষয়টি ছেড়ে দিই?
দেখ! read_only_properties
উদ্ধারকালে সাজসজ্জা!
@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
আপনি জিজ্ঞাসা:
কোথা read_only_properties
থেকে আসছে?
ভাল লাগছে আপনাকে জিজ্ঞাসা করলেন, এখানে উৎস 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
হালনাগাদ
আমি কখনই আশা করি না যে এই উত্তরটি এত মনোযোগ পাবে। আশ্চর্যজনকভাবে এটি হয়। এটি আপনাকে ব্যবহার করতে পারে এমন একটি প্যাকেজ তৈরি করতে আমাকে উত্সাহিত করেছে।
$ pip install read-only-properties
আপনার অজগর শেল:
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
এবং বিশ্বাস করুন যে কেউ পরিবর্তন করবে নাx
। যদিx
এটি পরিবর্তন করা যায় না তা নিশ্চিত করা গুরুত্বপূর্ণ, তবে কোনও সম্পত্তি ব্যবহার করুন।