Python入門の反射

2754 ワード

Python入門の反射
1、反射:(自省)
反射とは、主にプログラムが自身の状態や動作にアクセス、検出、変更できる能力(自省)を指す.
Pythonのオブジェクトへの反射:オブジェクトの関連プロパティを文字列で操作します.Pythonの中のすべてのものは対象です(反射を使うことができます)
<1>getattr()取得
<2>setattr()設定
<3>hasattr()は存在するか否かを判断する
<4>delattr()削除
(1)文字列によるオブジェクトの属性とメソッドの操作
class A:
    def __init__(self,name):
        self.name = name

    def func(self):
        print("is A func")
a = A("rimo")


A.func()
print(a.name)
a.func()

(2)オブジェクトの角度反射を使う
class A:
    def __init__(self,name):
        self.name = name

    def func(self):
        print("is A func")
a = A("rimo")

print(hasattr(a,"name"))  #    True    name       a   

print(getattr(a,"name"))
f = getattr(a,"func")
f()
setattr(a,"age",18)
print(a.__dict__)

delattr(a,"name")
print(a.__dict__)

(3)クラスの角度に反射を使う
class A:
    def __init__(self,name):
        self.name = name

    def func(self):
        print("is A func")

a = A("rimo")

print(hasattr(A,"name"))
f = getattr(A,"func")
f(11)

(4)現在のモジュールでの反射の使用
def func():
    print("is func")

#     :
print(globals()["func"])

import sys
o = sys.modules[__name__]   #             
f = getattr(o,"func")
f()

(5)その他のモジュールでの反射の使用
import test       #     
test.func()

o = globals()["test"]
getattr(o,"func")()

(6)反射の適用シーン
class Blog:

    def login(self):
        print("is login")

    def register(self):
        print("is register")

    def comment(self):
        print("is comment")

    def log(self):
        print("is log")

    def log_out(self):
        print("is log_out")

b = Blog()

func_dic = {
    "1":b.login,
    "2":b.register,
    "3":b.comment,
    "4":b.log,
    "5":b.log_out
}

msg = """
1.  
2.  
3.  
4.  
5.  
"""

choose = input(msg)
if choose in func_dic:
    func_dic[choose]()

上記のコードを修正して、コードを減らします(文字列でオブジェクトの属性と方法を操作します)
class Blog:
    def login(self):
        print("is login")

    def register(self):
        print("is register")

    def comment(self):
        print("is comment")

    def log(self):
        print("is log")

    def log_out(self):
        print("is log_out")

b = Blog()

msg = """
login
register
comment
log
log_out
"""

while 1:
    choose = input(msg)
    if hasattr(b,choose):
        getattr(b,choose)()
    else:
        print("     !")