সরল তিরস্কার:
class VocalDescriptor(object):
def __get__(self, obj, objtype):
print('__get__, obj={}, objtype={}'.format(obj, objtype))
def __set__(self, obj, val):
print('__set__')
class B(object):
v = VocalDescriptor()
B.v # prints "__get__, obj=None, objtype=<class '__main__.B'>"
B.v = 3 # does not print "__set__", evidently does not trigger descriptor
B.v # does not print anything, we overwrote the descriptor
এই প্রশ্নের কার্যকর ডুপ্লিকেট রয়েছে , তবে সদৃশটির উত্তর দেওয়া হয়নি এবং আমি শিখার অনুশীলন হিসাবে সিপিথন উত্সে আরও কিছুটা খনন করেছি। সতর্কতা: আমি আগাছায় .ুকে গেলাম। আমি সত্যিই আশা করছি যে আমি সেই জলের কথা জানি এমন একজন অধিনায়কের কাছ থেকে সাহায্য পেতে পারি । আমি আমার নিজের ভবিষ্যতের সুবিধার জন্য এবং ভবিষ্যতের পাঠকদের সুবিধার জন্য আমি যে কলগুলি দেখছিলাম তার সন্ধানে যথাসম্ভব সুস্পষ্ট হওয়ার চেষ্টা করেছি।
আমি __getattribute__বর্ণনাকারীদের প্রয়োগের আচরণের উপর প্রচুর কালি ছিটকে দেখেছি , উদাহরণস্বরূপ অনুসন্ধানের নজরে। পাইথন snippet মধ্যে "আবাহন বর্ণনাকারী" শুধু নিচের For classes, the machinery is in type.__getattribute__()...মোটামুটিভাবে আমার মনের মধ্যে কি আমি বিশ্বাস করি সংশ্লিষ্ট সঙ্গে একমত CPython উৎস মধ্যে type_getattro, যা আমি এ খুঁজছেন দ্বারা নিচে ট্র্যাক "tp_slots" তারপর যেখানে tp_getattro জনবহুল হয় । এবং B.vপ্রাথমিকভাবে মুদ্রণের বিষয়টি __get__, obj=None, objtype=<class '__main__.B'>আমার কাছে বোধগম্য।
আমি যা বুঝতে পারি না তা হ'ল অ্যাসাইনমেন্টটি B.v = 3ট্রিগার করার পরিবর্তে অন্ধভাবে বর্ণনাকারীকে ওভাররাইট করে v.__set__? আমি "টিপি_স্লটস" থেকে আরও একবার শুরু করে সিপিথন কলটি সনাক্ত করার চেষ্টা করেছি , তারপরে tp_setattro কোথায় জনবসতিযুক্ত তা সন্ধান করে , তারপরে টাইপ_সেট্ট্রোর দিকে তাকিয়ে আছি । type_setattro উপস্থিত হতে পারে কাছাকাছি একটি পাতলা মোড়কের _PyObject_GenericSetAttrWithDict । এবং আমার বিভ্রান্তির শিষ্টাচারটি এখানে _PyObject_GenericSetAttrWithDictউপস্থিত রয়েছে : এমন যুক্তি রয়েছে যা কোনও বর্ণনাকারীর __set__পদ্ধতিকে প্রাধান্য দেয় !! এটিকে মনে রেখে, আমি ট্রিগার করার চেয়ে B.v = 3অন্ধভাবে কেন ওভাররাইট করে তা বুঝতে পারি না ।vv.__set__
দাবি পরিত্যাগী 1: আমি printfs সঙ্গে উৎস থেকে পাইথন পুনর্নির্মাণের করা হয়নি, তাই আমি সম্পূর্ণরূপে নিশ্চিত নই type_setattroকি সময় বলা হচ্ছে হয় B.v = 3।
দাবি অস্বীকার 2: VocalDescriptor"আদর্শ" বা "প্রস্তাবিত" বর্ণনাকারী সংজ্ঞাটির উদাহরণ হিসাবে নয় mp পদ্ধতিগুলি কখন ডাকা হচ্ছে তা আমাকে বলার জন্য এটি একটি ভার্জোজ নো-অপশন।
__get__এলো __set__না কেন তার চেয়েও কেন কাজ করেছিল।
__get__পদ্ধতিটি চালু করা উচিত। B.v = 3কার্যকরভাবে একটি দিয়ে গুণকে ওভাররাইট করেছে int।
__get__হয় object.__getattribute__এবং কোনও উদাহরণ বা শ্রেণি ব্যবহারের সময় ডিফল্ট রূপায়ণ এবং আবেদন করা হয় । মাধ্যমে অ্যাসাইন করা কেবল উদাহরণস্বরূপ। type.__getattribute____get____set__
__get__পদ্ধতিগুলি ট্রিগার হওয়ার কথা। গাইড ক্লাস অনুসারে এভাবেই ক্লাসমেডোডস এবং @ স্ট্যাটিকমেডসগুলি কার্যকর করা হয় । @ জ্যাব আমি ভাবছি কেন B.v = 3ক্লাস বর্ণনাকারকে ওভাররাইট করতে সক্ষম? CPython বাস্তবায়ন উপর ভিত্তি করে, আমি আশা B.v = 3এছাড়াও ট্রিগার __set__।