ฟังก์ชันไม่ทราบว่าเป็นวิธีการ ณ จุดนิยามหรือไม่เมื่อโค้ดมัณฑนากรทำงาน เฉพาะเมื่อเข้าถึงผ่านตัวระบุคลาส / อินสแตนซ์เท่านั้นที่อาจทราบคลาส / อินสแตนซ์ เพื่อเอาชนะข้อ จำกัด นี้คุณสามารถตกแต่งด้วยวัตถุตัวอธิบายเพื่อชะลอรหัสตกแต่งจริงจนกว่าจะถึงเวลาเข้าถึง / โทร:
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'}