В функции __getattr__()
, если указанная переменная не найдена, выдается ошибка. Как я могу проверить, существует ли переменная или метод как часть объекта?
import string
import logging
class Dynamo:
def __init__(self,x):
print "In Init def"
self.x=x
def __repr__(self):
print self.x
def __str__(self):
print self.x
def __int__(self):
print "In Init def"
def __getattr__(self, key):
print "In getattr"
if key == 'color':
return 'PapayaWhip'
else:
raise AttributeError
dyn = Dynamo('1')
print dyn.color
dyn.color = 'LemonChiffon'
print dyn.color
dyn.__int__()
dyn.mymethod() //How to check whether this exist or not
Проще просить прощения, чем разрешения.
Не проверяйте, существует ли метод. Не тратьте ни единой строчки кода на "проверку"
try: dyn.mymethod() # How to check whether this exists or not # Method exists and was used. except AttributeError: # Method does not exist; What now?
источник
dyn.mymethod()
возникаетAttributeError
сам.Проверить, есть ли у класса такой метод?
hasattr(Dynamo, key) and callable(getattr(Dynamo, key))
или же
hasattr(Dynamo, 'mymethod') and callable(getattr(Dynamo, 'mymethod'))
Вы можете использовать
self.__class__
вместоDynamo
источник
None
не вызывается, поэтому вы можете просто сделатьcallable(getattr(Dynamo, 'mymethod', None))
. Я использовал этот ответ, потому что мой super (). Mymethod () мог выброситьAttributeError
def getattr(object, name, default=None):
я подозреваю, не точна, потому что если бы это было так, я бы ожидал, что передача None в качестве третьего параметра не изменит поведение функции.help(getattr)
: «Когда задан аргумент по умолчанию, он возвращается, если атрибут не существует; без него в этом случае возникает исключение». - (и действительно, вы можете проверить, что getattr вызывает исключение, если атрибут отсутствует) так ясно, что что бы ни было PyCharm, это неправильно.if hasattr(self, "work") and callable(self.work)
. Это проверяет, имеет ли экземпляр рабочий атрибут (может быть либо переменной, либо функцией), а затем проверяет, может ли он быть вызван (что означает, что это функция).Вы можете попробовать использовать модуль inspect:
import inspect def is_method(obj, name): return hasattr(obj, name) and inspect.ismethod(getattr(obj, name)) is_method(dyn, 'mymethod')
источник
Я использую служебную функцию ниже. Он работает с лямбда-выражениями, методами класса, а также с методами экземпляра.
Полезный метод
def has_method(o, name): return callable(getattr(o, name, None))
Пример использования
Определим тестовый класс
class MyTest: b = 'hello' f = lambda x: x @classmethod def fs(): pass def fi(self): pass
Теперь ты можешь попробовать,
>>> a = MyTest() >>> has_method(a, 'b') False >>> has_method(a, 'f') True >>> has_method(a, 'fs') True >>> has_method(a, 'fi') True >>> has_method(a, 'not_exist') False
источник
try
оператор) и проверяет всякий раз, когда член является фактической функцией. отличная доля!Как насчет того, чтобы поискать это
dyn.__dict__
?try: method = dyn.__dict__['mymethod'] except KeyError: print "mymethod not in dyn"
источник
Может быть, так, если все методы вызываются
app = App(root) # some object call app att = dir(app) #get attr of the object att #['doc', 'init', 'module', 'button', 'hi_there', 'say_hi'] for i in att: if callable(getattr(app, i)): print 'callable:', i else: print 'not callable:', i
источник
Если ваш метод находится за пределами класса, и вы не хотите запускать его и вызывать исключение, если оно не существует:
'mymethod' in globals()
источник
Думаю, тебе стоит посмотреть на
inspect
упаковку. Это позволяет «обернуть» некоторые вещи. Когда вы используетеdir
метод, он также перечисляет встроенные методы, унаследованные методы и все другие атрибуты, делающие возможными коллизии, например:class One(object): def f_one(self): return 'class one' class Two(One): def f_two(self): return 'class two' if __name__ == '__main__': print dir(Two)
Массив, который вы получаете,
dir(Two)
содержит какf_one
и, такf_two
и множество встроенных вещей. С помощьюinspect
вы можете сделать это:class One(object): def f_one(self): return 'class one' class Two(One): def f_two(self): return 'class two' if __name__ == '__main__': import inspect def testForFunc(func_name): ## Only list attributes that are methods for name, _ in inspect.getmembers(Two, inspect.ismethod): if name == func_name: return True return False print testForFunc('f_two')
В этих примерах по-прежнему перечислены оба метода в двух классах, но если вы хотите ограничить проверку только функцией в определенном классе, потребуется немного больше работы, но это абсолютно возможно.
источник