反射

面向对象3

isinstance(obj,cls)检查obj是否类cls的对象

class Foo:
    pass
class Bar(Foo):
    pass
print(issubclass(Bar,Foo))

反射

所谓反射,是指程序可以访问,检测和修改它本身状态或者行为的一种能力(自身)

在python中,面向对象中的反射是指通过字符串的形式操作对象的相关属性.

四个可以实现自省的函数

attribute

  • hassttr
    • hasattr(*arg,**kwargs)
  • getsttr
    • getattar(obj,name,
  • setsttr
  • delsttr
# class Foo:
#     pass
# class Bar(Foo):
#     pass
# print(issubclass(Bar,Foo))

# class Foo:
#     f= "类的静态变量"
#     def __init__(self,name,age):
#         self.name = name
#         self.age= age
#     def say(self):
#         print("hello,%s"%self.name)
#
# obj = Foo("Tom",22)

# # 检测是否含有某个属性
# print(hasattr(obj,'name'))
# print(hasattr(obj,'say'))
#
# # 获取属性
# gt = getattr(obj,'name')
# print(gt)
# gtf = getattr(obj,'say')
# gtf()
#
# print(obj.__dict__)
# #设置属性
# setattr(obj,'goo name',True)
# setattr(obj,'show_name',lambda self:self.name + 'good man')
# print(obj.__dict__)
# print(obj.show_name(obj))
#
# # 删除属性
# delattr(obj,'show_name')
# print(obj.__dict__)
# delattr(obj,"hello")

联想,字符串,列表元祖可以通过索引值引用值,字典可以通过关键字引用值,用了[]

item系列

class Foo:
    def __init__(self,name):
        self.name = name
    def __getitem__(self, item):
        print(self.__dict__[item])
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __delitem__(self, key):
        print("del obj[key]时:")
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print("del obj.key时:")
        self.__dict__.pop(item)

obj1 = Foo('Tom')
obj1['age'] = 18
obj1['age1']=19
print(obj1.__dict__)
del obj1['age']
del obj1.age1
print(obj1.__dict__)

‘_del_’

构建方法,当对象在内存中被释放,就会自动触发执行.

一般不需要定义

‘_str_’

  • 如果直接print打印对象.会看到创建对象的内存地址.
  • 当我们使用print(xxx)时,输出对象,如果对象定义了’_str_'方法,就会就是打印该方法return的信息描述

类装饰器

首先,’_call_'方法

def func():
    print("hello")

func()
print(func())
#调用 --->call--->called

对应的,类实例对象的调用,需要用到’_call_"特殊方法


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

    def __call__(self,classmate):
        print("我的名字的是%s,我的同桌是%s"%(self.name,self.classmate))
stu = Student("梁子慧")
stu("氧气")

用类实现装饰器

通过’_init_‘和’_call_’

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

    def __call__(self,classmate):
        print("我的名字的是%s,我的同桌是%s"%(self.name,self.classmate))
stu = Student("梁子慧")
stu("氧气")


class Test:
    def __init__(self,func):
        print("装饰器准备装饰")
        self.__func=func
    def __call__(self, *args, **kwargs):
        print("Wrapper Context")
        self.__func(*args, **kwargs)
@Test
def show():
    print("hello")
print("flag")
show()

正则表达式

正则表达式,又称规则表达式,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

  • 给定的字符串,是否符合正则表达式的过滤逻辑(匹配)
  • 通过正则表达式,从字符串中获得我们想要的特定的部分.

使用场景

  • 爬虫
  • 数据挖掘和分析

假如a = “ab23fd5g67”,提取23,5,67,如何实现


在Python中使用正则需要导入`re`包

​```python
import re
​```

首先我们来看两个例子来体验一下正则表达式的威力吧:

### 引入案例1

比如,已知一个列表:

​		li = ["Chinese", "China", "English", "Britain", "Canada", "New Zealand"]

找出以Ch开头的字串。

​```python
# 法1
li = ["Chinese", "China", "English", "Britain", "Canada", "New Zealand"]
lt = []
for i in li:
	if i[0:2] == "Ch":
		lt.append(i)
print(lt)
# 法2
li = ["Chinese", "China", "English", "Britain", "Canada", "New Zealand"]
print([i for i in li if i[0:2]=="Ch"])
​```

Python正则表达式的基础

单字符匹配规则

字符功能
.匹配任意一个字符(除了\n)
[]匹配[]中列举的字符
\d匹配数字
\D匹配非数字(\d取反)
\w匹配字,A-Z,a-z,0-9,_
\W\w取反
\s匹配空白,即 空格,tab键
\S匹配非空白
  • re.match(pattern,string,flags=0)

    • 作用:从字符串开头开始匹配一个模式
      • 匹配成功,返回一个匹配成功的对象.
      • 否则,返回None.
    • 参数说明:
      • pattern:匹配的正则表达式
      • string:要匹配的字符串
      • flags:标志位,用于控制正则表达式的匹配方式.比如是否匹配多行,是否区分大小写.
  • re.group([group1,…]) 字符串或者元组

    • 作用:获得一个或者多个分组截获的字符串
    • 指定多个参数时就会以元组形式返回
    • group1可以使用编号,也可以使用别名
    • 编号0代表匹配整个字符串,默认返回group(0)
    • 如果没有截获子串,返回None.
    • 截获了多次的组,返回最后一次截获的子串
  • re.groups([default=None]) tuple

  • 作用:以元组形式返回全部分组截获的字符串.类似调用re.group(1,2,…,last)

  • 如果没有截获字符串的组,默认返回None.

demo:

数量匹配规则

字符功能
*匹配前一个字符出现0次多次或者无限次,可无可多可少
+匹配前一个字符穿线1次多次或者无限次,知道出现一次
?匹配前一个字符出现1次或者0次,要么一次要么没有
{m}匹配一个字符出现m次
{m,}匹配前一个字符至少出现m次
{m,n}匹配一个字符出现m到n次

表示边界

字符
^匹配字符开头
$匹配字符结尾
\b匹配一个单词单词边界 boundary
\B匹配非单词边界

匹配分组

字符
|匹配左右任意一个表达式
(ab)将括号中的字符作为一个分组
\num引用分组num匹配到字符串
(?P)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

re.search(pattern,str,flags=0)

​ 作用:扫描整个字符串,返回第一次成功匹配的对象’

​ 若果匹配失败,返回none.

​ 参数:

re.findall(pattern,str,flags=0)

  • 作用:获取字符串中所有匹配的子串,并以列表形式返回

re.finditer(pattern,str,flags=0)

  • 作用:获取和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

​ re.match()和re.search()的区别

  • re.match()从字符开头开始匹配,如果匹配失败,None;
  • re.search()匹配整个字符串,直到找到一个匹配,如果失败返回none
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值