欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python学习日记(二十七) 反射和几个内置函数

程序员文章站 2022-04-15 15:27:01
isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 issubclass() 判断issubclass(sub,super)中sub是否是super类的派生类 反射 反射就是用字符串类型的名字去操作变量,python中的一切事物皆为对象(都可以使用反射) ......

isinstance()

判断isinstance(obj,cls)中obj是否是cls类的对象

class person:
    def __init__(self,name):
        self.name = name
p = person('jane')
print(isinstance(p,person))       #true

issubclass()

判断issubclass(sub,super)中sub是否是super类的派生类

class person:
    def __init__(self,name):
        self.name = name
class father(person):
    pass
print(issubclass(father,person))    #true
print(issubclass(person,father))    #false

反射

反射就是用字符串类型的名字去操作变量,python中的一切事物皆为对象(都可以使用反射)

1.hasattr()

函数用于判断对象是否包含对应的属性,通常和getattr一起搭配使用,先用hasattr判断是否这个对象含有这个属性,如果有就通过getattr来拿值,如果没有就提示没有这个属性

class person:
    age = 20
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.weight = weight
    def fuc(self):
        print('weight...height...')
#1
if hasattr(person,'age'):
    print(getattr(person,'age'))          #20
else:
    print('没有这个类属性!')
#2
p = person('adson',1.6,75)
if hasattr(p,'bmi'):
    print(getattr(p,'bmi'))
else:
    print('没有这个属性!')                #没有这个属性!
#3
if hasattr(p,'fuc'):
    getattr(p,'fuc')()                   #weight...height...
else:
    print('没有这个方法!')

2.getattr()

函数用于返回一个对象属性值

(1)反射对象的属性

class a:
    def __init__(self,name):
        self.name = name
a = a('adson')
ret = getattr(a,'name')
print(ret)                      #adson

(2)反射对象的方法

class a:
    def fuc(self):
        print('this is fuc!')
a = a()
ret = getattr(a,'fuc')
print(ret)                  #<bound method a.fuc of <__main__.a object at 0x00000000024e1c88>>  获得一个绑定方法的地址
ret()                       #this is fuc!   在ret后加上括号去调用方法

(3)反射类的属性

class a:
    age = 18
ret = getattr(a,'age')
print(ret)                 #18

(4)反射类的方法(classmethod、staticmethod)

一般的调用方式是类名.方法名

class a:
    @classmethod
    def fuc(cls):
        print('this is class fuc!')
ret = getattr(a,'fuc')
print(ret)              #<bound method a.fuc of <class '__main__.a'>>  获得一个绑定方法
ret()                   #this is class fuc!
getattr(a,'fuc')()      #this is class fuc! 简写

(5)反射模块的变量

先建立一个模块,模块名pyfile.py,增加一个变量

dic = {'apple' : 18,'banana' : 20}

然后通过我的模块反射pyfile模块的变量

import pyfile
print(pyfile.dic)                        #{'apple': 18, 'banana': 20}
ret = getattr(pyfile,'dic')
print(ret)                               #{'apple': 18, 'banana': 20}

(6)反射模块的方法

先建立一个模块,模块名pyfile.py,增加一个方法

def fuc():
    print('abc123aaa!!!')

然后通过我的模块反射pyfile模块方法

import pyfile
ret = getattr(pyfile,'fuc')
print(ret)                             #<function fuc at 0x0000000002498d08>
ret()                                  #abc123aaa!!!
getattr(pyfile,'fuc')()                #abc123aaa!!!

(7)反射模块的类

先建立一个模块,模块名pyfile.py,增加一个类

class b:
    price = 200
    def __init__(self,name):
        self.name = name
    def fuc(self):
        print('this classb fuc..' + self.name)

然后通过我的模块反射pyfile模块方法

import pyfile
b = getattr(pyfile,'b')('josn')            #getattr相当于拿到了这个模块的b类 并进行实例化了一个b对象
print(b.__dict__)                          #{'name': 'josn'}
print(b.price)                             #200
b.fuc()                                    #this classb fuc..josn

(8)反射自身模块的变量

通过sys.modules['__main__']找到当前的模块

import time
import sys
t = time.asctime(time.localtime(time.time()))
print(t)                                        #mon sep  9 22:36:40 2019
print(sys.modules['__main__'])                  #<module '__main__' from 'c:/users/administrator/pycharmprojects/pyl/temp_file/temp_py.py'>
print(sys.modules['__main__'].t)                #mon sep  9 22:38:01 2019
ret = getattr(sys.modules['__main__'],'t')
print(ret)                                      #mon sep  9 22:39:05 2019

(9)反射自身模块的方法

import sys
def fuc():
    print('abc123...')
ret = getattr(sys.modules['__main__'],'fuc')
print(ret)                                    #<function fuc at 0x0000000002798730>
ret()                                         #abc123...
getattr(sys.modules['__main__'],'fuc')()      #abc123...

3.setattr()

用于设置属性值,该属性不一定是存在的

class person:
    age = 20
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.weight = weight
#对一个对象修改
p = person('adson',1.6,75)
setattr(p,'name','jane')
setattr(p,'height',1.7)
setattr(p,'gender','male')
print(p.__dict__)                   #{'name': 'jane', 'height': 1.7, 'weight': 75, 'gender': 'male'}
#对一个类修改
print(person.__dict__)              #{'__module__': '__main__', 'age': 20, '__init__': <function person.__init__ at 0x0000000002548950>,
                       '__dict__': <attribute '__dict__' of 'person' objects>, '__weakref__':
                       <attribute '__weakref__' of 'person' objects>, '__doc__': none} setattr(person,'age',21) setattr(person,'name','jane') setattr(person,'height',1.7) setattr(person,'gender','male') print(person.__dict__) #{'__module__': '__main__', 'age': 21, '__init__': <function person.__init__ at 0x0000000002548950>,
                       '__dict__': <attribute '__dict__' of 'person' objects>, '__weakref__':
                       <attribute '__weakref__' of 'person' objects>, '__doc__': none,
                       'name': 'jane', 'height': 1.7, 'gender': 'male'}

这里的不同之处在于对象和类它们存放值的命名空间不同

4.delattr()

用于删除属性

class person:
    age = 20
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.weight = weight
p = person('adson',1.6,75)
print(p.__dict__)                   #{'name': 'adson', 'height': 1.6, 'weight': 75}
delattr(p,'height')
print(p.__dict__)                   #{'name': 'adson', 'weight': 75}
print(person.__dict__['age']) #20 delattr(person,'age') print(person.__dict__['age']) #keyerror: 'age'

 

内置类方法