issubclassとでisinstance、反射、組み込みメソッド

高度なオブジェクト指向

、issubclassとでisinstance

1.1 issubclass

issubclass()

効果:括弧内の最初のクラスを決定するためには、第二のクラスのサブクラスではないTrueまたはFalseの値を返します。

例えば:

class A:
    pass
class B(A):
    pass
class C:
    pass

print(issubclass(B,A))  # True
print(issubclass(C,A))  # False

1.2でisinstance

でisinstance()

処置:最初のパラメータを決定するために使用するには、TrueまたはFalseに結果を返す、第二ブラケットのオブジェクトパラメータではありません。

例えば:

class A:
    pass
class B:
    pass

a = A()
print(isinstance(a,A))  # True
print(isinstance(a,B))  # False

第二に、反射

2.1反射とは何ですか

文字列で判断し、取得、設定、属性やメソッド(すべての主題である、などのクラス、モジュール、を含む)のオブジェクトを削除します。

2.2 4オブジェクトのプロパティは、内蔵することができる機能や、文字列の操作方法

括弧の最初の引数に4つの機能オブジェクトであります

hasattr():オブジェクト内の属性は、TrueまたはFalseを返すかどうかを判断します

GETATTR():プロパティメソッドまたは文字列を取得、取得した場合、それは対応するプロパティやメソッドを返します。

SETATTR():プロパティを設定するための方法または文字列

delattr():属性を削除する方法または文字列

2.2.1はhasattr()

オブジェクト内の属性は、オブジェクトが最初のパラメータがあるかどうかを決定する、2番目のパラメータは、TrueまたはFalseを返すプロパティです

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
cmd=input('请输入命令:')
if hasattr(p,cmd):  # 先判断属性cmd是否在对象p中
    run=getattr(p,cmd)   # 如果输入run,该属性或方法就在对象p中,就会返回,加括号就可以调用
    run()
else:
    print('该命令不存在')  # 输入的属性不在对象中的话,就执行这步

2.2.2のgetattr()

文字列プロパティまたはメソッドを取得することにより、取得された場合、それは対応するプロパティまたはメソッドが返され、上記のコードの使用が書き込まれています

2.2.3 SETATTR()

図1に示すように、ユーザー入力キーとオブジェクトに割り当てられた値を介して

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
key=input('请输入key:')  # 输入age
value=input('输入value:')  # 输入18
setattr(p,key,value)  # 将{'ag':'18'}赋值给对象p
print(p.age)  # 18

2、動的メソッドは、オブジェクトを配置します

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
def test(a):
    print(a)
print(p.__dict__)  # {}
setattr(p,'test',test)  
print(p.__dict__)  # {'test': <function test at 0x000001DF69C81E18>}
p.test(0) # 0

2.3.4 delattr()

プロパティの動的削除オブジェクトp変数属性

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
p.name='lqz'
p.age=18
p.sex='male'
a=input('请输入要删除的属性:')  # 输入sex
print(p.__dict__)  # {'name': 'lqz', 'age': 18, 'sex': 'male'}
delattr(p,a)   #把属性sex删除
print(p.__dict__)  # {'name': 'lqz', 'age': 18}
# 直接p.a是不对的
# del p.a  这个会报错

第三に、組み込みの方法

前に学びました__init__

3.1 __str____repr__

1 __str__:あなたは書き換えていない場合は__str__、プリントプリントを書き換えた場合、それはあなたが望むものをプリントアウトし、メモリアドレスを出力します

2 __repr__:と__str__同様の、直接的には、実行、対話型のコマンドで変数名を書きます__repr__

class Foo:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '['+self.name+']'

f=Foo('nick')
print(f.__str__())  # [nick]
print(f)     #相当于上面那句  # [nick]
l=[1,2,3]
#本质也是已经调用list的__str__方法
print(l)

3.2ポイントインターセプト法:__setattr____delattr____getattr__

オブジェクトがプロパティを取得する場合は、一度いずれかを取得するには、に入ります__getattr__

あなたがいずれかを取得するために、一度、オブジェクトに属性を割り当てた場合、に入ります__setattr__

属性が削除された場合オブジェクトが入ります__delattr__

class Foo:
    def __init__(self,name):
        self.name=name
    def __getattr__(self, item):
        # print('xxxx')
        return '你傻逼啊,没有这个字段'
    def __setattr__(self, key, value):
        print('yyyyy')
    def __delattr__(self, item):
        print('zzzzz')
f=Foo('nick')  # 给对象f赋值属性,对象中没有这个属性,进入到__setattr__方法  # yyyyy
print(f.name)  # 获取name属性,对象中没有属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
print(f.age)   # 没有age属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
print(f.__dict__)   # {}
print(f.name)  # 没有name属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
f.sex='male'   # 给对象f赋值属性,对象中没有sex这个属性,进入到__setattr__方法  # yyyyy

del f.name    # 删除对象name属性,对象中没有这个属性,进入__delattr__方法  # zzzzz
print(f.__dict__)  # {}

3.3 __item__

それが呼び出す場合、[]括弧値、割当によるオブジェクトは、価値を削除する__item__方法を

class Foo:
    def __init__(self, name):
        self.name = name
    def __getitem__(self, item):
        name=getattr(self,item)
        # print(name)
        # print(self.__dict__[item])
        return name
        # return self.__dict__[item]
    def __setitem__(self, key, value):
        print('obj[key]=lqz赋值时,执行我')
        self.__dict__[key] = value
    def __delitem__(self, key):
        print('del obj[key]时,执行我')
        self.__dict__.pop(key)
f=Foo('nick')
print(f['name'])

3.4 __call__

オブジェクトのブラケットは、それを呼び出します

class Foo:
    def __call__(self):
        print('xxxx')

f=Foo()
f()  # xxxx

3.5 __enter____exit__

自然管理コンテキストで

class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        # return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')


with Open('a.txt') as f:
    print('=====>执行代码块')
    # print(f,f.name)
出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
=====>执行代码块
with中代码块执行完毕时执行我啊
  • 出口三つのパラメータ()例外コードブロック文を表示して、コードを用いて実行することができない、例外タイプ、および外れ値トレーサビリティ情報を表します
class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)


try:
    with Open('a.txt') as f:
        print('=====>执行代码块')
        raise AttributeError('***着火啦,救火啊***')
except Exception as e:
    print(e)

文が表示されると__enter__オブジェクトがトリガされ、戻り値は次のように宣言された変数に割り当てられている
=====>コードブロックが実行され
、私はブロックああ終わったときに実行して
、<クラスのはAttributeErrorを'>
火火災ああ
<0x1065f1f88でトレースバックオブジェクト>
火、火災ああ

  • __exit()の戻り値がtrueの場合だ何事もなかったかのように、例外は、通常の実行と文の後、空になります
class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        return True


with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
print('0' * 100)  #------------------------------->会执行

文が表示されると__enter__オブジェクトがトリガされ、戻り値は次のように宣言された変数に割り当てられている
=====>コードブロックが実行され
、私はブロックああ終わったときに実行して
、<クラスのはAttributeErrorを'>
火火災ああ
<トレースバックが0x1062ab048たオブジェクトで、声をかけ>
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

おすすめ

転載: www.cnblogs.com/zhuangyl23/p/11449534.html