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()

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

时间: 2024-10-11 06:27:21

Python 基础第二十三天(反射)的相关文章

python基础第二课

一  认识模块 1.1  sys #!/usr/bin/env python3 # Author: Sam Gao import sys print(sys.path) #打印PYTHONPATH环境变量 # ['/home/sam/PycharmProjects/s14/day1', # '/home/sam/PycharmProjects/s14', # '/usr/lib/python35.zip', # '/usr/lib/python3.5', # '/usr/lib/python3.

python基础-第二篇

一.运算符 1.算数运算: 算数运算符相信大家都不陌生吧,尤其是加减乘除,好!那我就带着大家看看最后三个,这三个到底是干什么玩意的? %,取两数相除的余数,看图: **,x的多少次幂,看图: //,取整除,你可以理解为向下取整,看图: 2.比较运算: 注意:当为一个等号时,多为赋值,两个等号为比较,另外不等于常用是!= 3.赋值运算: 4.逻辑运算: 逻辑运算符里,and和or好理解,那我就讲一下not:这家伙就是唱反调的--看图 5.成员运算: 成员运算符,从字面上意思去理解,问谁是不是某组织

python基础-第十三篇-13.1web框架本质

基础与概念 众所周知,对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 web框架分两类:一类是包括socket和业务逻辑(tornado),另一类就是只负责业务逻辑 对于第二类,没有socket就要使用其他的服务器程序,比如wsgi,它负责封装客户的请求信息,我们只要按它提供的方法获取数据 首先我们明白了其本质就是socket,如果从socket开始开发应用程序那么效率就太低了,正确的做法是底层的socket处理代码由专门的服务器软件实现,

Python 学习第二十三天 django 知识(五)

一,django 的model操作 1,字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 us

python 基础第二篇

一. 循环. while循环 while 条件:代码块(循环体)执行流程: 判断条件是否为真. 如果真. 执行代码块 再次判断条件是否为真...... 当条件为假.执行else 跳出循环. 循环结束 1.让计算机连续打印5次corn,每次延迟一秒: import time count = 1 while count <=5: print("corn") count = count + 1 time.sleep(1) 2.让用户尽情的喷,按 q 退出,并且过滤掉"马化腾&

学习python课程第二十三天

一.    组合 : 1. 什么是组合 ? 一个对象的属性是来自于另外一个类的对象, 称之为组合. (跟继承其实很相似.都是共用一个类里面的属性) 2. 为何用组合 ? 组合也是用来解决类与类代码冗余的问题. 3. 如何用组合 ? class Foo: aaa=1111 def __init__(self,x,y): self.x=x self.y=y def func1(self): print('Foo内的功能') class Bar: bbb=2222 def __init__(self,

python 全栈 python基础 (十三)匿名函数 与 内置函数

一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是参数,可以有多个,用逗号隔开:冒号右边的为表达式,需要注意的是只能有一个表达式.由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收.  3.注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值.lambda 函数不能包含命令,包含

python基础第二天(day14)

参考https://www.cnblogs.com/alex3714/articles/5465198.html 多行注释  '''  '''变成字符串 """  """ 单引号,双引号没有区别,只适用于单行 三个单引号,双引号 多行 #是真正的被注释掉 数据类型初识 1.数字 int(整型)   long(长整型) python3没有长整型的概念,自动变 float(浮点型)    复数 2.布尔值 真或假  True  false 1 或 0

Java基础--第二十三天

多线程:         多条执行单元 进程:正在运行的应用程序 线程:进程的执行单元,一条执行路径 迅雷下载,360清理 多线程程序实现: 线程依赖于进程存在,Thread类 子类继承 子类重写run方法 调用strart(),让线程启动,调用run()方法 同一个线程对象连续两次启动,报错:表示该线程状态有问题 getName()方法:标志不同线程,获取线程名称 setName():更改线程名字 线程随机性: 程序执行,抢占CPU资源,CPU在多个程序间切换. 第二种实现: 创建类,实现Ru