গতিশীল টাইপ তৈরির সাথে এটি বাস্তবায়ন করা যাক:
import copy
def namedgroup(typename, fieldnames):
def init(self, **kwargs):
attrs = {k: None for k in self._attrs_}
for k in kwargs:
if k in self._attrs_:
attrs[k] = kwargs[k]
else:
raise AttributeError('Invalid Field')
self.__dict__.update(attrs)
def getattribute(self, attr):
if attr.startswith("_") or attr in self._attrs_:
return object.__getattribute__(self, attr)
else:
raise AttributeError('Invalid Field')
def setattr(self, attr, value):
if attr in self._attrs_:
object.__setattr__(self, attr, value)
else:
raise AttributeError('Invalid Field')
def rep(self):
d = ["{}={}".format(v,self.__dict__[v]) for v in self._attrs_]
return self._typename_ + '(' + ', '.join(d) + ')'
def iterate(self):
for x in self._attrs_:
yield self.__dict__[x]
raise StopIteration()
def setitem(self, *args, **kwargs):
return self.__dict__.__setitem__(*args, **kwargs)
def getitem(self, *args, **kwargs):
return self.__dict__.__getitem__(*args, **kwargs)
attrs = {"__init__": init,
"__setattr__": setattr,
"__getattribute__": getattribute,
"_attrs_": copy.deepcopy(fieldnames),
"_typename_": str(typename),
"__str__": rep,
"__repr__": rep,
"__len__": lambda self: len(fieldnames),
"__iter__": iterate,
"__setitem__": setitem,
"__getitem__": getitem,
}
return type(typename, (object,), attrs)
ক্রিয়াকলাপ চালিয়ে যাওয়ার আগে তারা বৈধ কিনা তা দেখতে এটি বৈশিষ্ট্যগুলি পরীক্ষা করে।
তাহলে কি এই বাছাইযোগ্য? হ্যাঁ যদি (এবং কেবলমাত্র) আপনি নিম্নলিখিতটি করেন:
>>> import pickle
>>> Point = namedgroup("Point", ["x", "y"])
>>> p = Point(x=100, y=200)
>>> p2 = pickle.loads(pickle.dumps(p))
>>> p2.x
100
>>> p2.y
200
>>> id(p) != id(p2)
True
সংজ্ঞাটি আপনার নেমস্পেসে থাকতে হবে এবং আচার এটির জন্য এটি যথেষ্ট দীর্ঘ থাকতে হবে exist সুতরাং আপনি যদি এটি আপনার প্যাকেজে থাকতে সংজ্ঞা দেন তবে এটি কাজ করা উচিত।
Point = namedgroup("Point", ["x", "y"])
আপনি নিম্নলিখিতগুলি সম্পাদন করলে বা সংজ্ঞাটিকে অস্থায়ী করে তুললে আচার ব্যর্থ হবে (ফাংশন শেষ হয়ে গেলে সুযোগের বাইরে চলে যায়, বলুন):
some_point = namedgroup("Point", ["x", "y"])
এবং হ্যাঁ, এটি টাইপ তৈরির তালিকাভুক্ত ক্ষেত্রগুলির ক্রম সংরক্ষণ করে।