Warum kann decorator
eine statische Methode oder eine Klassenmethode nicht dekorieren?Warum kann @decorator eine statische Methode oder eine Klassenmethode nicht dekorieren?
from decorator import decorator
@decorator
def print_function_name(function, *args):
print '%s was called.' % function.func_name
return function(*args)
class My_class(object):
@print_function_name
@classmethod
def get_dir(cls):
return dir(cls)
@print_function_name
@staticmethod
def get_a():
return 'a'
Sowohl get_dir
und get_a
Ergebnis in AttributeError: <'classmethod' or 'staticmethod'>, object has no attribute '__name__'
.
Warum beruht decorator
auf dem Attribut __name__
anstelle des Attributs func_name
? (Afaik alle Funktionen, einschließlich Klassenmethoden und staticmethods, haben das func_name
Attribut.)
Edit: Ich benutze Python 2.6.
Warum rufen Sie Funktion (* args) in der Dekorateur? Es ist Aufgabe, einfach eine Funktion zurückzugeben (in Ihrem Fall nicht modifiziert). – gahooa
gahooa: weil das ist ein Weg 'Dekorator' (was er importiert, nicht das Sprachkonstrukt) funktioniert, siehe http://pypi.python.org/pypi/decorator. –
@taldor Sie haben Dekorator-Modul in Py 2.6? – mykhal