スムーズなpython学習ノート-10章

3342 ワード

10章-シーケンスの変更、ハッシュ、スライス
はんしゃ
反射とは主に、pythonですべてのオブジェクト(クラス、インスタンス、モジュールなど)がオブジェクトにアクセスし、検出し、変更できる機能を指し、反射の形式でオブジェクト関連のプロパティを操作できます.
文字列データ型の変数名または関数名で対応する属性A.b getattr(A,'b')を呼び出す
さぎょう
1.挿抜可能な機構を実現する
インタフェースを事前に定義することができます.インタフェースは完了してから本当に実行されます.これはプラグアンドプレイを実現します.これは実は「後期バインド」です.どういう意味ですか.つまり、主な論理を事前に書き(インタフェースのみを定義)してから、後でインタフェースの機能を実現することができます.
例を挙げます.
demo.py
class FanShe(object):
    x = 1

    def test1(self):
        print('this is test1')

    def test(self):
        print("this is test")

その他のファイル呼び出し:
import demo as tf

c = tf.FanShe

#   c    test    ,       ,            
if hasattr(c, 'test'):
    func = getattr(c, 'test')
    print(func("hello"))

else:
    print('      ')
    print('       ')

2.動的インポートモジュール
demo/__init__.py demo/work.py
work.py
def test():
    print('this is test')

このワークを外層で呼び出したい.pyのtestメソッドでは、次の方法を使用できます.
M = __import__('demo.work')
print(M)
M.work.test()

#       
import importlib

M = importlib.import_module('demo.work')
print(M)
M.test()

Python反射方法
Pythonでの反射には主に以下の方法があります.
1.hasattr(object,name)オブジェクトにname文字列が1つあるか否かを判断する方法または属性
2.getattr(object,name,default=None)オブジェクトname文字列属性の値を取得し、defaultを返す値が存在しない場合
3.setattr(object,key,value)設定オブジェクトのkey属性はobjectに等しいvalue値である.key = value
4.delattr(object,name)オブジェクトのname文字列属性を削除
class Cat(object):
    class_level = '  '

    def __init__(self, name, type, speed, age):
        self.name = name
        self.type = type
        self.speed = speed
        self.age = age

    def run(self):
        print('%s  %s%s   %s     ' %
              (self.age, self.type, self.name, self.speed))


xiaohua = Cat('  ', '   ', '10m/s', 10)
xiaohua.run()  # 10          10m/s     

# hasattr(object, name)            name           
print(hasattr(xiaohua, 'name'))  #   xiaohua   name   ,  True,     name   ,
#   'name'         

print(hasattr(xiaohua, 'size'))  #   False      size   

# 2.getattr(object, name, default=None)     name       ,
#        default  
print(getattr(xiaohua, 'speed', '20m/s'))  # 10m/s

#   xiaohua speed   ,speed     
print(xiaohua.__dict__)
# {'name': '  ', 'type': '   ', 'speed': '10m/s', 'age': 10}

print(getattr(xiaohua, 'weight', '5kg'))
# 5kg,   xiaohua weight  ,      ,  default  

# print(getattr(xiaohua, 'weight'))  #    default ,     
#     AttributeError: 'Cat' object has no attribute 'weigh'

# 3.setattr(object, key, value)#      key   value 
#    object.key = value

setattr(xiaohua, 'weight', '5kg')
#  xiaohua  weight   
print(xiaohua.__dict__)
# {'name': '  ', 'type': '   ', 'speed': '10m/s', 'age': 10, 'weight': '5kg'}

# 4.delattr(object, name)      name     

delattr(xiaohua, 'weight')
print(xiaohua.__dict__)
# {'name': '  ', 'type': '   ', 'speed': '10m/s', 'age': 10}