Как получить callable атрибуты у объекта?
На первый взгляд ответ на этот вопрос очень простой. Обратиться к полю __dict__ и отфильтровать по свойству callable. Проблема в том, что у объекта определено поле __slots__, что не даёт этого сделать.
Есть ли какой-нибудь иной способ получить имена всех методов класса, не переписывая сам класс, имею в виду удаления поля __slots__?
Update @S.Nick
from abc import ABC
from typing import Dict
class Abstract(ABC):
__slots__ = set()
def __init__(self, attributes: Dict):
attributes = {k: v for (k, v) in attributes.items() if k in self.__slots__}
for attr, val in attributes.items():
setattr(self, attr, val)
class A(Abstract):
__slots__ = {'a', 'b'}
def method1(self):
return 'method1'
def method2(self):
return 'method2'
class B(Abstract):
__slots__ = {'c', 'd'}
def method3(self):
return 'method3'
def method4(self):
return 'method4'
class Combiner:
def __init__(self, data: Dict):
self.met1 = A(data)
self.met2 = B(data)
def get_method(self, func_name):
pass
Хочу чтобы метод get_method по имени функции возвращал соответствующий метод из классов A и B. То есть:
>>> g = Combiner()
>>> g.get_method('method2')
<bound method A.method2 of <__main__.A object at 0x10f520438>>
Ответы (2 шт):
Если задача - получить именно методы (а не вообще все callable аттрибуты), то можно так:
class Example:
__slots__ = ['a', 'b', 'c']
def foo():
pass
def bar():
pass
example = Example()
import inspect
methods = inspect.getmembers(example, predicate=inspect.ismethod)
print([name for name, method in methods])
Если же хочется вообще все callable аттрибуты, то замените predicate=inspect.ismethod на predicate=callable
попробуйте так:
class my:
__slots__ = "a", "b"
def foo(self):
pass
for el in dir(my):
if callable(getattr(my, el)):
print(el)
если магические методы не нужны, то так:
for el in dir(my):
if callable(getattr(my, el)) and not el.startswith("__"):
print(el)