python 3.4 类的内置函数,高级使用 反射实现原理

类的内置函数

不推荐type判断数据的类型
x =111
print(type(x) is int)


print(isinstance(x,int))
# 是不是实例的意思,x 是不是实例化的意思

class FOO():
    pass
print(issubclass(FOO,object))

判断是不是子类的 功能。 子类涵盖了 子类,子子类

面向对象的高级

内置方法:都是在满足某种条件下自动触发的

class People():

    def __init__(self,name,age,f):
        self.name = name
        self.age = age
        self.f = f


    def __str__(self): # 打印 对象的信息
        # print('dfgds')
        return '%s:%s'%(self.name,self.age)

    def __del__(self):  # 回收资源的功能 ,删对象就会触发运行
        self.f.close()

obj = People('zhangsa',19,open('a.tx','w',encoding='utf-8'))
print(obj)

del obj

反射 : 程序运行过程当中 ,可以分析出来一个对象都包含 那些属性,并且可以操纵这些属性




class  Foo():

    def __init__(self,x,y):
        self.x = x
        self.y = y

    def f1(self):
        print('from f1')

obj = Foo(111,222)

需求 这个obj对象,就想知道倒数第一个的属性的值 怎么处理


1、打印这个对象的所有属性,看一下最后一个属性是什么?
res = dir(obj)
# print(res)

# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
# '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f1', 'x', 'y']

res = res[-1]
# 2、打印这个对象的属性字典



print(obj.__dict__) # 通过dict 这个列表可以看到对象的属性值



# 3、根据字典的内容,可以看到每一个属性都跟着一个值


print(obj.__dict__[res])  # 使用dict字典的 ,根据dir里的属性名称为键,打印出这个属性的值、,如果这个对象的属性在类中,或在其父类中,那么找 类的dict和 父类的dict就可以了。



反射的内置命令
hasattr(obj,'x')   # 判断对象的属性有没有,使用hasattr 返回 True 是有,返回False 是没有

getattr(obj,'x')   # 获取一个对象的属性的  值

任意一个对象的所有属性的值,全部打印出来

import re
for attr in dir(obj):
    if not re.search('^__.*__$',attr):

        print(getattr(obj,attr))


getattr(obj,'xxxx',None)   # 如果没有这个属性怎么办,程序会报错,,,那么返回值定义为None,就不会报错了



setattr(obj,'xxx','111')  # 这个命令是给对象添加新的属性的

print(obj.xxx)

delattr(obj,'xxx')  # 这个命令是给对象删除属性的

posted @ 2022-02-06 19:47  mmszxc  阅读(29)  评论(0)    收藏  举报