Siempre y cuando usted está interesado sólo en Python 3.x (y de los paréntesis vacíos en su declaración de clase voy supongo que puede ser), entonces, en realidad, hay una manera simple de hacerlo sin decoradores: Python 3 le permite proporcionar su propio diccionario como objeto para usar mientras se define la clase.
El código siguiente es de PEP3115 excepto para el último par de líneas que he añadido a imprimir los métodos con el fin de:
# 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__')])
¿Alguna manera de hacerlo si no me importa el pedido? – curious
Claro, voy a editar la respuesta. –