1. isinstance()
isinstance(对象A,类B)
,用来判断对象A是不是类B的实例- 可以专门用
isinstance()
来判断数据类型
class Foo:
pass
obj=Foo()
print(isinstance(obj,Foo))
============================
True
- 用来判断是否属于数据类型
d={'a':1,'b':2}
print(isinstance(d,dict))
===========================
True
2. issubclass()
- 判断一个类是否为另一个类的子类
class Parent:
pass
class Sub(Parent):
pass
print(issubclass(Sub,Parent))
================================
True
二、反射
1. 什么是反射
- 通过字符串来操作类或者对象的属性
2. hasattr
- 用来判断属性是否存在
- 语法:
hasattr(对象名或类名,'字符串形式的属性名')
- 底层原理是查看
__dict__
中有没有
class People:
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
obj=People('xut',18)
print(hasattr(obj,'name'))
print(hasattr(People,'name')) # 这是对象的属性
print(hasattr(People,'country'))
========================================================
True
False
True
3. getattr
- 查看属性的内容
- 语法:
getattr(类名或对象名,'字符串形式的属性名',,'如果属性找不到可以在这里添加注释,通常写为None')
class People:
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('eat......')
obj=People('xut',18)
print(getattr(People,'eat'))
print(People.eat)
print(getattr(obj,'eat'))
print(obj.eat)
# 找不到可以加注释,否则报错
print(getattr(obj,'e','aaaaaa'))
=============================================================
<function People.eat at 0x0000022EB81BD1E0>
<function People.eat at 0x0000022EB81BD1E0>
<bound method People.eat of <__main__.People object at 0x0000022EB81DF400>>
<bound method People.eat of <__main__.People object at 0x0000022EB81DF400>>
aaaaaa
4. setattr
- 修改属性的内容
- 语法:
setattr(对象或类名,'字符串属性名',修改的内容)
class People:
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('eat......')
obj=People('xut',18)
setattr(obj,'age',20)
print(obj.age)
========================================
20
5. delattr
- 删除属性的内容
- 语法:
delattr(对象或类名,'字符串形式的属性名')
class People:
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('eat......')
obj=People('xut',18)
print(obj.__dict__)
delattr(obj,'name')
print(obj.__dict__)
=======================================
{'name': 'xut', 'age': 18}
{'age': 18}
6. 应用案例:
class Ftp:
def __init__(self,ip,port):
self.ip=ip
self.port=port
def get(self):
print('Get Function')
def put(self):
print('Put Function')
def run(self):
while True:
choice=input('>>>:').strip()
method=getattr(self,choice,None)
if method is None:
print('输入的名字不存在')
else:
method()
obj=Ftp('10.0.0.1',23)
obj.run()
====================================================
>>>:get
Get Function
>>>:put
Put Function
>>>:
三、内置方法
- 以
__
开头__
结尾的,会满足某种条件自动触发
1. str
__str__
会在在打印对象时,自动触发,并且__str__
下的return
必须返回字符串类型
# 自定义的类,默认打印对象时,只打印对象的内存地址
class Foo:
pass
obj=Foo()
print(obj)
==============================================
<__main__.Foo object at 0x000002819764A5F8>
# 而内置的数据类型,可以打印出对象的信息
d={'a':1,'b':2}
print(d)
==============================================
{'a': 1, 'b': 2}
- 定制打印对象的格式
class People:
def __init__(self,name,age):
self.name=name
self.age=age
# 在对象被打印时,自动触发,应该在该方法内采集与对象self有关的信息,然后拼成字符串返回
def __str__(self):
return 'name:%s age:%s' %(self.name,self.age)
obj=People('xut',18)
print(obj)
print(obj)
===========================================================
name:xut age:18
name:xut age:18
2. del
__del__
会在对象被删除前,自动触发,__del__
也叫析构方法
① 程序结束会触发__del__
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def __del__(self):
print('run------------->')
obj=People('xut',18)
print('程序运行结束,程序内存空间被回收,触发__del__')
====================================================
程序运行结束,程序内存空间被回收,触发__del__
run------------->
说明:程序运行完了,内存空间就会被回收清除(Python解释器的回收),即被删除,就会触发
__del__
② 主动删除对象,会触发__del__
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def __del__(self):
print('run------------->')
obj=People('xut',18)
del obj
print('程序运行结束')
======================================
run------------->
程序运行结束
③ 同时占用系统资源和应用程序资源时,需要__del__
配合删除
class People:
def __init__(self,name,age):
self.name=name
self.age=age
# open打开文件会同时占用系统和应用程序的资源
self.f=open('a.txt','rt',encoding='utf-8')
def __del__(self):
# 只是在应用程序中删除,还需要回收系统资源
self.f.close()
obj=People('xut',18)
print('程序运行结束')