__getattr__
অভিনব কিছু করার জন্য আমি ক্লাসে পদ্ধতিটি ওভাররাইড করতে চাই তবে আমি ডিফল্ট আচরণটি ভাঙতে চাই না।
এটি করার সঠিক উপায় কী?
__getattr__
অভিনব কিছু করার জন্য আমি ক্লাসে পদ্ধতিটি ওভাররাইড করতে চাই তবে আমি ডিফল্ট আচরণটি ভাঙতে চাই না।
এটি করার সঠিক উপায় কী?
উত্তর:
ওভাররাইডিং ঠিক __getattr__
থাকতে হবে - __getattr__
কেবলমাত্র শেষ অবলম্বন হিসাবে ডাকা হয় অর্থাত্ যদি নামের সাথে মেলে এমন কোনও বৈশিষ্ট্য না থাকে। উদাহরণস্বরূপ, আপনি যদি অ্যাক্সেস করেন foo.bar
তবে __getattr__
কেবল তখনই ডাকা হবে যখন foo
কোনও অ্যাট্রিবিউট না বলা হয়েছে bar
। বৈশিষ্ট্যটি হ'ল আপনি যদি পরিচালনা করতে চান না তবে উত্থাপন করুন AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
তবে, এর বিপরীতে __getattr__
, __getattribute__
প্রথম বলা হবে (কেবলমাত্র নতুন স্টাইলের ক্লাসের জন্য কাজ করে যারা বস্তু থেকে উত্তরাধিকারসূত্রে আসে)। এই ক্ষেত্রে, আপনি এর মতো ডিফল্ট আচরণ সংরক্ষণ করতে পারেন:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
আরও জন্য পাইথন ডক্স দেখুন ।
__getattr__
- কোনও ধারণা কি করতে হবে? ( AttributeError: 'super' object has no attribute '__getattr__'
)
AttributeError
ব্যতিক্রম আরগসগুলিতে বৈশিষ্ট্যের প্রসঙ্গ ছাড়াই আছে without
class A(object):
def __init__(self):
self.a = 42
def __getattr__(self, attr):
if attr in ["b", "c"]:
return 42
raise AttributeError("%r object has no attribute %r" %
(self.__class__.__name__, attr))
>>> a = A()
>>> a.a
42
>>> a.b
42
>>> a.missing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: 'A' object has no attribute 'missing'
>>> hasattr(a, "b")
True
>>> hasattr(a, "missing")
False
self.__class__.__name__
পরিবর্তে এটি ব্যবহার করা উচিতself.__class__
__repr__
মাইকেল উত্তরটি প্রসারিত করতে, আপনি যদি ডিফল্ট আচরণটি ব্যবহার করে বজায় রাখতে চান তবে আপনি __getattr__
এটি এর মতো করতে পারেন:
class Foo(object):
def __getattr__(self, name):
if name == 'something':
return 42
# Default behaviour
return self.__getattribute__(name)
এখন ব্যতিক্রম বার্তা আরও বর্ণনামূলক:
>>> foo.something
42
>>> foo.error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattr__
AttributeError: 'Foo' object has no attribute 'error'
__getattr__
এবং __getattribute__
?