文章目录
一、isinstance和issubclass
# 判断某个对象是不是某个类的实例
# isinstance()
class Person:
pass
class Student(Person):
pass
stu = Student()
print(isinstance(stu,Student)) #True
#判断是不是子类
#issubclass()
print(issubclass(Student,Person)) #True
二、反射
-
什么是反射:其实说的是反省,简单的说就是对象要具备一种修正错误的能力
hasattr 是否存在某个属性
getattr 获取某个属性的值
setattr 设置某个属性的值
delattr 删除某个属性
-
什么时候用反射:
如果在编写代码期间,就能明确知道我要访问的属性,没有必要使用反射
如果在编写代码期间,无法明确知道我要访问的属性,这时就应该使用反射
class Student:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def study(self):
print("学生正在学习...")
stu = Student("矮根","woman",38)
print(stu.name) #矮根
#当你获取到一个对象,但是并不清楚对象的内部细节时,就需要使用反射了
def test(obj):
if hasattr(obj,"name"):
print(getattr(obj,"name","没有name属性"))
test(stu)
#设置属性的值
setattr(stu,"school","beijing")
print(getattr(stu,"school","没有学校属性")) #beijing
#删除属性的值
delattr(stu,"school")
print(getattr(stu,"school","没有学校属性")) #没有学校属性
#删除属性的值
delattr(stu,"age")
print(stu.age)
练习:
class Student:
def study(self):
print("学习中....")
stu = Student()
res = getattr(stu,"study",None)
print(res)
def eat(self):
print("正在吃饭...")
#可以通过反射的方式为对象增加一个方法,但是注意这样增加的方法就是一个普通函数,不会自动传值
setattr(stu,"eat",eat) #<function eat at 0x0000021994A82E18>
eat(stu) #正在吃饭...
========