Python 基础第二十三天(反射)

今日主要内容

1.面向对象高级特性---反射

2.内置函数和内置方法补充

1.什么是反射:

通过内置函数getattr(),hasattr(),setattr(),delattr()实现,在类外通过对字符串的操作,能够将类内同名的静态变量,方法,如对象属性是无法取到值的.

也可以理解为:

***正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值

使用字符串数据类型的变量名 访问一个命名空间中的名字

找一个属性 ,直接就可以找到这个属性的值

找一个方法 ,找到的是这个方法的内存地址

例:

class A:
    role = 'Person'
    def func(self):
        a = 'b'
        print("*" * self)
print(getattr(A,'role')) #静态变量的反射
print(getattr(A,'func')) #类中方法取到的是内存地址
getattr(A,'func')(3) #类中方法的反射

**类使用类命名空间中的名字

例:下面例中使用对象名进行获取

class A:
    role = 'Person'
    def __init__(self):
        self.money = 500
    def func(self):
        print('*'*10)

a = A()  #实例化a 为对象名称
print(a.func) 
getattr(a,'func')() 
print(getattr(a,'money'))

***对象使用对象能用的方法和属性

内置函数的介绍:

hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值

模块含义:模块就是类所在python的文件名

例:

def login():
    print('执行login功能')
def register():
    print('执行register功能')

import sys
print(sys.modules['__main__'])  #<module '__main__' from 'F:/Python-script-2/s11-day23/a.py'> 
func = input('>>>')
if hasattr(sys.modules['__main__'],func)#检查输入的信息,是否a.py有
    getattr(sys.modules['__main__'],func)()  # 有就执行该函数

类使用类命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名,'名字')
模块使用模块中的名字
导入模块
getattr(模块名,'名字')

import os 
getattr(os,'rename')('user','user_info')

getattr一定要和hasattr配合使用

setattr  # 修改和新建

delattr  # 删除一个属性

setattr

例:

class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahahaha')

a = A('alex')
a.name
a.wahaha()
getattr(a,'name')
print(a.__dict__)
setattr(a,'age',18)  #增加了一个属性
print(a.__dict__)

结论:
wahahahahaha
{'name': 'alex'}
{'name': 'alex', 'age': 18}

delattr

例:

class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahahaha')

a = A('alex')
a.name
a.wahaha()
getattr(a,'name')
print(a.__dict__)
setattr(a,'age',18)
print(a.__dict__)
delattr(a,'age')
print(a.__dict__)

结论:
wahahahahaha
{'name': 'alex'}
{'name': 'alex', 'age': 18}
{'name': 'alex'}

2.内置函数,方法补充

isinstance :判断一个对象和一个类有没有血缘关系

issubclass:issubclass(子类名,父类名) 如果返回True,说明有继承关系.判断子类和父类是否有继承关系

isinstance与type方法类似,都能判断数据类型,但是isinstance还能还能检测是否有继承关系

例:

class B:pass
class A(B):pass
a = A()
print(isinstance(a,A))
print(isinstance(a,B))  # 能够检测到继承关系
print(type(a) is A)
print(type(a) is B)     # type只单纯的判断类
# 判断一个对象和一个类有没有血缘关系
isinstance(a,A)

__hash__ :object类自带的方法.只有类实现了__hash__,hash()才能用

__len__:放在类中的计算传值结果的长度,数量  同len(),类中含有__len__方法,才能使用len()函数

原文地址:https://www.cnblogs.com/tom2ling/p/8877791.html