ফাংশনটি জানে না যে এটি সংজ্ঞা পয়েন্টে কোনও পদ্ধতি, কিনা যখন ডেকরেটার কোডটি চালায়। শ্রেণি / উদাহরণ শনাক্তকারীর মাধ্যমে যখন এটি অ্যাক্সেস করা হয় কেবল তখন এটির শ্রেণি / উদাহরণটি জানতে পারে। এই সীমাবদ্ধতা কাটিয়ে ওঠার জন্য, আপনি অ্যাক্সেস / কল করার সময় পর্যন্ত আসল সজ্জা কোডটি বিলম্ব করতে বর্ণনাকারী অবজেক্ট দ্বারা সজ্জিত করতে পারেন:
class decorated(object):
def __init__(self, func, type_=None):
self.func = func
self.type = type_
def __get__(self, obj, type_=None):
func = self.func.__get__(obj, type_)
print('accessed %s.%s' % (type_.__name__, func.__name__))
return self.__class__(func, type_)
def __call__(self, *args, **kwargs):
name = '%s.%s' % (self.type.__name__, self.func.__name__)
print('called %s with args=%s kwargs=%s' % (name, args, kwargs))
return self.func(*args, **kwargs)
এটি আপনাকে স্বতন্ত্র (স্ট্যাটিক | শ্রেণি) পদ্ধতিগুলি সাজাতে দেয়:
class Foo(object):
@decorated
def foo(self, a, b):
pass
@decorated
@staticmethod
def bar(a, b):
pass
@decorated
@classmethod
def baz(cls, a, b):
pass
class Bar(Foo):
pass
এখন আপনি অন্তঃসংশোধনের জন্য ডেকোরেটর কোডটি ব্যবহার করতে পারেন ...
>>> Foo.foo
accessed Foo.foo
>>> Foo.bar
accessed Foo.bar
>>> Foo.baz
accessed Foo.baz
>>> Bar.foo
accessed Bar.foo
>>> Bar.bar
accessed Bar.bar
>>> Bar.baz
accessed Bar.baz
... এবং ফাংশন আচরণ পরিবর্তন করার জন্য:
>>> Foo().foo(1, 2)
accessed Foo.foo
called Foo.foo with args=(1, 2) kwargs={}
>>> Foo.bar(1, b='bcd')
accessed Foo.bar
called Foo.bar with args=(1,) kwargs={'b': 'bcd'}
>>> Bar.baz(a='abc', b='bcd')
accessed Bar.baz
called Bar.baz with args=() kwargs={'a': 'abc', 'b': 'bcd'}