Я пытаюсь распечатать список методов, которые не были унаследованы от других классов (например, не унаследованы от object или другого базового класса). В качестве примера скажем, у меня есть следующий класс:

class Point:
    def __init__(self, x, y):
        self.__x=x
        self.__y=y

Вызов этого метода должен вывести: [__init__] без __str__ (наследуется от объекта).

Я пробовал:

dir(Point) 

Но проблема в том, что он включает уже унаследованные методы.

2
Teererai Marange 24 Окт 2018 в 06:26

2 ответа

Лучший ответ

Вы можете заглянуть в __dict__ самого класса:

import types

def list_methods(t):
    for name, item in t.__dict__.items():
        if isinstance(item, types.FunctionType):
            print(name)

t здесь объект класса, а не экземпляр класса. Если вы хотите работать с экземплярами, замените t.__dict__.items() на type(t).__dict__.items() в цикле.

2
Mad Physicist 24 Окт 2018 в 04:44

Чтобы напечатать не унаследованные атрибуты объекта, такие как объект класса, используйте vars, который проверяет __dict__ этого объекта:

In [1]: class Point:
   ...:     def __init__(self, x, y):
   ...:         self.__x=x
   ...:         self.__y=y
   ...:

In [2]: vars(Point)
Out[2]:
mappingproxy({'__dict__': <attribute '__dict__' of 'Point' objects>,
              '__doc__': None,
              '__init__': <function __main__.Point.__init__>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Point' objects>})

Так как метод является просто вызываемым объектом в классе, вы можете проверить его, используя что-то вроде:

In [3]: for k, v in vars(Point).items():
   ...:     if callable(v):
   ...:         print(k)
   ...:
__init__
3
juanpa.arrivillaga 24 Окт 2018 в 03:30
52960660