高度なオブジェクト指向
、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