সরল তিরস্কার:
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
অন্ধভাবে কেন ওভাররাইট করে তা বুঝতে পারি না ।v
v.__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__
।