isinstance()/issubclass
class Person:
pass
class Student(Person):
pass
stu = Student()
#判断是不是同一个类型
print(isinstance(stu,Student))
issubclass()#是否为子类
#判断Student是不是Person的子类
#所有类都是object的子类
print(issubclass(Student,Person))
反射
什么是反射
反射是程序的一种修改本身状态的一种能力(自省)
1. getatter(object, name[, default])
object -- 对象。
name -- 字符串,对象属性。
default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
>>>class A(object):
... bar = 1
... def b(self):
... print("cccc")
...
>>> a = A()
>>> getattr(a, 'bar') # 获取属性 bar 值
1
>>> getattr(a, "b") # 获取方法 b 值
<function b at 0x0000023FFD062E18>#打印了地址
>>> getattr(a, 'bar2') # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值
3
2. hasatter(object, name)
object -- 对象。
name -- 字符串,属性名。
class Coordinate:
x = 10
y = -5
z = 0
point1 = Coordinate()
print(hasattr(point1, 'x'))
print(hasattr(point1, 'y'))
print(hasattr(point1, 'z'))
print(hasattr(point1, 'no')) # 没有该属性
结果:
True
True
True
False
3. setattr(object, name, value)
object -- 对象。
name -- 字符串,对象属性。
value -- 属性值。
>>>class A(object):
... bar = 1
...
>>> a = A()
>>> getattr(a, 'bar') # 获取属性 bar 值
1
>>> setattr(a, 'bar', 5) # 设置属性 bar 值
>>> a.bar
5
4. delatter(object, name)
delattr(x, 'foobar') 相等于 del x.foobar。
object -- 对象。
name -- 必须是对象的属性。
class Coordinate:
x = 10
y = -5
z = 0
point1 = Coordinate()
print('x = ',point1.x)
print('y = ',point1.y)
print('z = ',point1.z)
delattr(Coordinate, 'z')
print('--删除 z 属性后--')
print('x = ',point1.x)
print('y = ',point1.y)
# 触发错误
print('z = ',point1.z)
setatter注意事项
class Student:
def study(self):
print("学习中....")
stu = Student()
res = getattr(stu,"study",None)
res()
def eat():#扩号里加self也没用
print("正在吃饭...")
# 可以通过反射的方式为对象增加一个方法 但是注意 这样增加的方法就是一个普通函数 不会自动传值
setattr(stu,"eat",eat)
stu.eat()
print(stu.__dir__())
getatter使用
可用于目录(利用反射机制,通过字符串查找同名属性值或方法的地址)
class CMD:
def dir(self):
print("列出当前文件夹目录....")
tasklist(self):
print("查看任务列表.....")
cmd = CMD()
res = input("请输入指令:").strip()
if hasattr(cmd,res):
func = getattr(cmd,res)
print(func)
func()
else:
print("输入的指令不正确....")