Tant que vous n'êtes intéressé que par 3.x Python (et des parenthèses vides dans votre déclaration de classe je vais devinez que vous pourriez être), alors il ya une manière simple de le faire sans décorateurs: Python 3 vous permet de fournir votre propre dictionnaire comme objet à utiliser pendant que la classe est définie.
Le code suivant est de PEP3115, sauf pour les deux dernières lignes que j'ajouté d'imprimer les méthodes pour:
# The custom dictionary
class member_table(dict):
def __init__(self):
self.member_names = []
def __setitem__(self, key, value):
# if the key is not already defined, add to the
# list of keys.
if key not in self:
self.member_names.append(key)
# Call superclass
dict.__setitem__(self, key, value)
# The metaclass
class OrderedClass(type):
# The prepare function
@classmethod
def __prepare__(metacls, name, bases): # No keywords in this case
return member_table()
# The metaclass invocation
def __new__(cls, name, bases, classdict):
# Note that we replace the classdict with a regular
# dict before passing it to the superclass, so that we
# don't continue to record member names after the class
# has been created.
result = type.__new__(cls, name, bases, dict(classdict))
result.member_names = classdict.member_names
return result
class MyClass(metaclass=OrderedClass):
# method1 goes in array element 0
def method1(self):
pass
# method2 goes in array element 1
def method2(self):
pass
x = MyClass()
print([name for name in x.member_names if hasattr(getattr(x, name), '__call__')])
Un moyen de le faire si je ne me soucie pas de la commande? – curious
Bien sûr, je vais modifier la réponse. –