Для каждой функции в классе в рамках Python

Как насчет этого метода, который принимает три аргумента как отдельные входные строки и предоставляет запасные варианты для предотвращения (некоторых) исключений:

def safeint(s, fallback):
    try:
        return int(s)
    except ValueError:
        return fallback

def range_lister():
    start = safeint(input("start: "), 0)
    stop = safeint(input("stop: "), 0)
    step = safeint(input("step: "), 1)  # Zero is not valid here
    trange=list(range(start, stop, step))
    print(trange)

.... некоторые тесты:

>>> range_lister()
start: 1
stop: 14
step: 3
[1, 4, 7, 10, 13]
>>> range_lister()
start: 
stop: 
step: 14
[]
>>> range_lister()
start: 14
stop: 2000
step: 24
[14, 38, 62, 86, 110, 134, 158, 182, 206, 230, 254, 278, 302, 326, 350, 374, 398, 422, 446, 
470, 494, 518, 542, 566, 590, 614, 638, 662, 686, 710, 734, 758, 782, 806, 830, 854, 878,
902, 926, 950, 974, 998, 1022, 1046, 1070, 1094, 1118, 1142, 1166, 1190, 1214, 1238, 1262,
1286, 1310, 1334, 1358, 1382, 1406, 1430, 1454, 1478, 1502, 1526, 1550, 1574, 1598, 1622,
1646, 1670, 1694, 1718, 1742, 1766, 1790, 1814, 1838, 1862, 1886, 1910, 1934, 1958, 1982]
>>> range_lister()
start: 
stop: 22
step: 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
5
задан Stefano Borini 13 April 2009 в 00:59
поделиться

6 ответов

Зависит от того, что вы подразумеваете под «функцией». Что-то вроде этого может работать, однако:

import inspect

def methods(c):
    return (m for m in (getattr(c, d) for d in dir(c))
            if inspect.ismethoddescriptor(m) or inspect.ismethod(m))

Тогда:

class C:
    def f(self): pass

>>> list(methods(C))
[<unbound method C.f>]
3
ответ дан 18 December 2019 в 14:51
поделиться

да, можно. Быстро и грязно:

class foo:
    def one(self):
        print "here is one"
    def two(self):
        print "here is two"
    def three(self):
        print "here is three"


obj = foo()
for entry in dir(obj):
    print entry, callable(getattr(obj,entry))
    if callable(getattr(obj,entry)):
        getattr(obj,entry)()

Если вы хотите более изощренную концепцию, проверьте модуль unittest.py. Должен быть код, который выполняет все методы, начинающиеся со строки «test»

4
ответ дан 18 December 2019 в 14:51
поделиться

Вот тот, который использует yield для циклического перебора функций в классе.

def get_functions(mod):
    for entry in dir(mod):
        obj=getattr(mod,entry);
        if hasattr(obj, '__call__') and hasattr(obj,'__func__') :
            yield obj

class foo:
    def one(self):
        print ("here is two")
        return 1
    def two(self):
        print ("here is two")
        return 2
    def three(self):
        print ("here is three")
        return 3


print(sum([fun() for fun in get_functions(foo())]))
1
ответ дан 18 December 2019 в 14:51
поделиться

Попробуйте использовать модуль проверки :

import inspect

class Spam:
    def eggs(self):
        print "eggs"
    def ducks(self):
        print "ducks"
    value = "value"

spam = Spam()
for name, method in inspect.getmembers(spam, callable):
    method()

Вывод:

ducks
eggs
1
ответ дан 18 December 2019 в 14:51
поделиться

Так как вы написали класс, Вы уже знаете все функции.

class ThisIsPeculiar( object ):
    def aFunction( self, arg1 ):
        pass
    def anotherFunction( self, thisArg, thatArg ):
        pass
    functionsToCall = [ aFunction, anotherFunction ]

>>> p= ThisIsPeculiar()
>>> p.functionsToCall
[<function aFunction at 0x6b830>, <function anotherFunction at 0x6b870>]
1
ответ дан 18 December 2019 в 14:51
поделиться

Встроенная директория перечислит все атрибуты объекта, например:

>>> class MyClass:
...     def one(self):
...         print "one"
...     def two(self):
...         print "two"
...     def three(self):
...         print "three"
... 
>>> dir(MyClass)
['__doc__', '__module__', 'one', 'three', 'two']

Он также работает с инициализированным class ..

>>> c = MyClass()
>>> dir(c)
['__doc__', '__module__', 'one', 'three', 'two']

Методы - это просто атрибуты, которые могут быть вызваны (через c.attribute () ) - мы можем использовать функцию getattr , чтобы ссылаться на этот метод через переменную. .

>>> myfunc = getattr(c, 'one')
>>> myfunc
<bound method MyClass.one of <__main__.MyClass instance at 0x7b0d0>>

Тогда мы можем просто вызвать эту переменную ..

>>> myfunc()
one # the output from the c.one() method

Поскольку некоторые атрибуты не являются функциями (в приведенном выше примере, __ doc __ и __ module __ ). Мы можем использовать встроенную вызываемую функцию , чтобы проверить, является ли это вызываемым методом (функцией):

>>> callable(c.three)
True
>>> callable(c.__doc__)
False

Итак, чтобы объединить все это в цикл:

>>> for cur_method_name in dir(c):
...     the_attr = getattr(c, cur_method_name)
...     if callable(the_attr):
...             the_attr()
... 
one
three
two

Помните, что это вызовет такие методы, как __ init __ , что, вероятно, нежелательно. Вы можете пропустить любые cur_method_name , которые начинаются с подчеркивания

3
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: