如何检查 Python 中是否存在方法?

在函数 __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
127661 次浏览

dir()getattr()之前的功能如何?

>>> "mymethod" in dir(dyn)
True

dyn.__dict__上查一下怎么样?

try:
method = dyn.__dict__['mymethod']
except KeyError:
print "mymethod not in dyn"

检查类是否有这样的方法?

hasattr(Dynamo, key) and callable(getattr(Dynamo, key))

或者

hasattr(Dynamo, 'mymethod') and callable(getattr(Dynamo, 'mymethod'))

您可以使用 self.__class__而不是 Dynamo

我认为你应该看看 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_onef_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')

这个示例仍然列出了两个类中的两个方法,但是如果您想将检查限制为只检查特定类中的函数,则需要多做一些工作,但是这是完全可能的。

请求原谅比请求许可要容易得多。

不要检查方法是否存在。不要在“检查”上浪费一行代码

try:
dyn.mymethod() # How to check whether this exists or not
# Method exists and was used.
except AttributeError:
# Method does not exist; What now?

你可以尝试使用“检查”模块:

import inspect
def is_method(obj, name):
return hasattr(obj, name) and inspect.ismethod(getattr(obj, name))


is_method(dyn, 'mymethod')

Maybe like this, assuming all method is callable

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()

我使用了下面的实用函数。它可以用于 lambda、类方法和实例方法。

实用方法

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

对于喜欢简单的人来说。


class ClassName:
def function_name(self):
return


class_name = ClassName()
print(dir(class_name))
# ['__init__', .... ,'function_name']


answer = 'function_name' in dir(class_name)
print("is'function_name' in class ? >> {answer}")
# is 'function_name' in class ? >> True