反射

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("输入的指令不正确....")

转载于:https://www.cnblogs.com/hldnn/p/10146641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值