反射:reflect,反射指的是一个对象应该具备可以检测、修改、增加自身属性的能力,反射就是通过字符串操作属性

    hasattr(对象,带查询的属性名称)

        判断某个对象中是否存在某个属性

    getattr

        从指定对象中取出属性,第三个参数为默认值,当参数不存在时返回的就是默认值

    setattr

        为对象添加新的属性

    delattr

        从对象中删除属性

    使用场景:

        反射其实就是对属性的增删改查,但是如果直接用dict来操作的话,语法繁琐,而且不是很好理解,另外一个主要的问题是,如果对象不是我自己写的是另一方提供的,我就必须要判断这个对象是否满足我的要求,也就是是否是我要的属性和方法

    框架的基石:

        原因: 因为框架的设计者,不可能提前知道你的对象到底是怎么设计的,所以你提供给框架的对象 必须通过判断验证之后才能正常使用,判断验证就是反射要做的事情,当然通过__dict__也是可以实现的, 其实这些方法也就是对__dict__的操作进行了封装,

        

元类:metaclass

    是什么:就是用于创建类的类,万物皆是对象,当然类也是对象

    对象是通过类实例化产生的,如果类也是对象的话,必然类对象也是有另一个类实例化产生的

    默认情况下所有累的元类都是type

    好处:高度的自定义一个类,类也是对象,也有自己的类

    __call__方法:当你调用对象时会自动执行元类中的__call__方法,并将这个类本身作为第一个参数传入,以及后面的一堆参数, 当覆盖元类中的call之后,这个类就无法产生对象,必须调用super().__call__来完成对象的创建并返回其返回值

        使用场景:

            当你想要控制对象的创建过程时,就需要覆盖__call__方法

        案例:将所有属性名称转换为大写

class Mytype(type):
def __call__(self, *args, **kwargs):
new_args = []
for i in args:
new_args.append(i.upper()) return super().__call__(*new_args, **kwargs) class Person(metaclass=Mytype):
def __init__(self, name):
self.name = name p = Person('william')
print(p.name)

        一旦覆盖了call之后,就必须要调用父类的call方法来产生对象并且返回这个对象

    __init__方法:

        使用场景:

            当你想要控制类的创建过程时,就覆盖__init__方法

    

    __new__方法:

        当你要创建对象时,会首先执行元类中的__new__方法,拿到一个空对象,然后自动调用__init__来对这个类进行初始化操作

        注意:如果你覆盖了该方法就必须保证new方法有返回值并且是对应的类对象

class Meta(type):

    def __new__(cls, *args, **kwargs):
print(cls) # 元类自己
print(args) # 创建类需要的几个参数 类名,基类,名称空间
print(kwargs) #空的
print("new run")
# return super().__new__(cls,*args,**kwargs)
obj = type.__new__(cls,*args,**kwargs)
return obj
def __init__(self,a,b,c):
super().__init__(a,b,c)
print("init run")
class A(metaclass=Meta):
pass
print(A)

    单例设计模式:

        使用原因:单例是为了节省资源,当一个类的所有对象属性全部相同时,那这时候就没有必要创建多个对象了

class meta(type):
def __call__(self, *args, **kwargs):
if hasattr(self, "obj"):
return getattr(self, "obj")
obj = super().__call__(*args, **kwargs)
self.obj = obj
print('创建了一个....')
return obj class Student(metaclass=meta):
def __init__(self, name):
self.name = name s1 = Student('william')
s2 = Student('william')
s3 = Student('william')
s4 = Student('william')

python基础--反射、元类、单例设计模式的更多相关文章

  1. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...

  2. Python基础:元类

    一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...

  3. 29 内置方法 eval | exec 元类 单例

    eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景:   1.执 ...

  4. Python基础:新式类的属性访问

    一.概述 二.准备工作 1.讨论对象 2.名词解释 三.实例绑定的属性访问 1.获取属性 一般规则 参考源码 示例验证 2.设置属性 一般规则 参考源码 示例验证 3.删除属性 一般规则 参考源码 示 ...

  5. JAVA_SE基础——38.单例设计模式

    本文继续介绍23种设计模式系列之单例模式. 我们在javaSE的基础学习中,会讲到:单例设计模式.模板设计模式.装饰者设计模式.观察者设计模式.工厂设计模式 我以后随着水平的提高,我会专门开个分类写设 ...

  6. python小总结3(异常、单例设计模式)

    一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...

  7. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  8. Python——单例设计模式

    单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...

  9. python学习【第十篇】单例设计模式

    单例设计模式 目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的. __new__方法 使用类名创建对象时,python解释器首先会调用__new__方法为对象分配 ...

随机推荐

  1. LUOGU P1514 引水入城 (bfs)

    传送门 解题思路 拉了很长的战线,换了好几种写法终于过了..首先每个蓄水场一定是对沙漠造成连续一段的贡献,所以可以$bfs$出每种状态,然后做一次最小区间覆盖,但这样的复杂度有点高.就每次只搜那些比左 ...

  2. springboot与任务(异步任务)

    描述:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...

  3. 用Spire.PDF提取PDF里的PNG图片

    用Nuget抓取类库,FreeSpire.PDF就可以 代码如下 , 亲测可以抓取PNG图形,即使原图是JPG,也会存成PNG格式输出: //加载PDF文档 PdfDocument doc = new ...

  4. java代码优化写法(转摘)

    本文源地址:https://blog.csdn.net/syc001/article/details/72841650 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序 ...

  5. Python-pip更改国内源

    windows方式: 1.打开任意文件夹,在上方地址栏中输入%appdata% 2.在此目录里新建文件夹pip 3.在pip文件夹里新建文件名:pip.ini 4.把以下内容复制到pip.ini中,保 ...

  6. CAS企业级单点登录原理

    https://blog.csdn.net/anumbrella/article/details/80821486 1. 单点登录概述 1.1. 什么是单点登录? 单点登录:Single Sign O ...

  7. property中ref、value、name的区别

    转载: 版权声明:本文为CSDN博主「qq_36098284」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net ...

  8. Codeigniter 数据库操作事务情况下获取不到last_insert_id()

    开发中,数据库Insert使用了事务,如果 $this->db->insert_id() 放在 $this->db->trans_complete(); 这句语句之后,$thi ...

  9. javascript的Touch事件

    js的touch事件,一般用于移动端的触屏滑动 $(function(){document.addEventListener("touchmove", _touch, false) ...

  10. 469 Same Tree

    原题网址:https://www.lintcode.com/problem/same-tree/description 描述 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构, ...