ホームページ  >  記事  >  バックエンド開発  >  Pythonのgetattr関数とhasattr関数の機能を詳しく解説

Pythonのgetattr関数とhasattr関数の機能を詳しく解説

WBOY
WBOYオリジナル
2016-06-16 08:47:501397ブラウズ

hasattr(オブジェクト, 名前)

機能: オブジェクトに name という名前の属性が含まれているかどうかを判断します (hasattr は getattr(ojbect, name) を呼び出して実装され、例外がスローされるかどうかを確認します)。

例:

>>> hasattr(list, 'append')
True >>> hasattr(list, 'add')
False 
getattr(object,name,default):

関数: オブジェクトの name という名前の属性の属性値を返します。属性名が存在しない場合は、その属性値が直接返され、AttribetError 例外がトリガーされるか、デフォルト値が返されます。オプションのパラメータdefaultが定義されている場合。

このメソッドの主な機能は、リフレクション メカニズムを実装することです。つまり、メソッド インスタンスは文字列を通じて取得できます。このようにして、クラスが呼び出す可能性のあるメソッドを構成ファイルに配置し、必要に応じてそれらを動的にロードできます。

以下では、小さな例を使用してその使用法を説明します。

import func_file #自定义python模块
cs=input('请输入要访问的URL:')
if cs=='loggin':
func_file.loggin()
if cs =='home':
func_file.home()
if cs =='':
pass#以下省略 

カスタムモジュールを定義してその中のメソッドを呼び出し、ifを使って判定する場合、モジュール内で多くのメソッドが使用されていると、開発効率に大きな影響を与え、コードの冗長性が劣るのは明らかです。お勧めです。以下では、hasattr() 関数を使用してニーズを実現します。

例は次のとおりです:


import func_file #自定义python模块,需事先存在
def run():
while True:
cs=input('请输入要访问的URL:')
#hasattr利用字符串的形式去对象(模块)中操作(寻找)成员
if hasattr(func_file,cs): #判断用户输入的URL是否在func_file模块中
func=getattr(func_file,cs) #有则将func_file模块下的cs函数赋值 
func() #等同于执行func_file模块下的cs函数
else:
print('404')#定义错误页面
run() 
カスタム モジュールをインポートした後、入力内容に応じて gataattr を動的にロードできます。ユーザー入力が存在するかどうかを判断するために hasattr() 関数が使用されます。存在しない場合は、カスタム メソッドが呼び出されます。


Web サイトの URL を開いたときの感覚とよく似ていると思いませんか?


前の例には問題があります。実際の状況では、関数関数が多数のモジュールに格納されている可能性があり、それぞれを個別にインポートする必要があるため、getattr() 関数を使用してモジュールを動的にロードできるでしょうか。もちろんです


例を参照:


def run():
while True:
cs=input('请输入:')
v,k=cs.split('/') #获得输入的模块和模块的方法
obj=__import__('lib.'+v,fromlist=True) #调用lib目录下的模块fromlist=True按路径连接的方式导入
if hasattr(obj,k):
f= getattr(obj,k)
f()
else:
print('404')
if __name__ == '__main__':
run() 
getattr は非常に強力だと思いますか?実際、getattr() は Python リフレクションを実装するための構成要素であり、setattr() や dir() などの他のメソッドと組み合わせると、多くの興味深いことができます。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。