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

Posted tom2ling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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与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__ :没用

__len__:放在类中的计算传值结果的长度,数量  同len()

 








以上是关于Python 基础第二十三天(反射)的主要内容,如果未能解决你的问题,请参考以下文章

No_16_0324 Java基础学习第二十三天

学习python课程第二十三天

python第二十三天-----作业中

Mysql基础第二十三天,更新和删除数据

Python 学习第二十三天 django 知识

javaSE第二十三天