先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序

class TMetaclass(type):
def __new__(cls,name,bases,attrs):
print('Metaclass new')
return type.__new__(cls,name,bases,attrs) class T(metaclass=TMetaclass):
def __init__(self, *args, **kwargs):
print('class init')
return super().__init__(*args, **kwargs)
def __new__(cls):
print('class new')
return super().__new__(cls)
Metaclass new
只定义,没有实例化,也会调用 metaclass new, 感觉就是静态语言中的编译类的定义, 不过python可是非常动态的控制类的定义

类的理解: 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。

但是在python这种动态语言中,不仅如此,类也是一种对象. 由type等元类创建的一种对象.

而且这种对象具有根据它创建其它对象(类实例)的能力.

alias_T =T  #把类当对象,赋值 拷贝等操作
t = alias_T()
class new
class init

观察上面的输出, 因为类这个对象已经通过元类来创建出来了,

接下类就是 调用类这个对象的__new__,创建类实例,然后再通过__init__初始化类实例

def echo_something(self):
print('print from new Attribute')
T.echo = echo_something #动态的给类这个变量增加成员方法(属性)
t.echo()
print from new Attribute

总之

__new__是静态方法 init是实例方法

元类 : 类的定义阶段

类的__new__ : 对象的创建阶段

类的__init__: 对象创建之后

下面是元类实现单例

class Singleton(type): #这也是个类 他实例化出来的对象就是一个类
def __init__(self, *args, **kw): #
print("metaclass __init__")
self.__instance = None # 这里的self就是元类创建出来的实例,也就是类Test
super().__init__(*args, **kw) def __new__(cls,name,bases,attrs):
print ("metaclass __new__")
return type.__new__(cls,name,bases,attrs) def __call__(self,*args,**kw): #对元类的实例即类进行调用的时候
if not self.__instance:
self.__instance = super().__call__(*args, **kw)
return self.__instance class Test(object,metaclass =Singleton):
def __init__(self,name): #其实只调用了一次 返回同一个对象
self.name = name t1 = Test('Tom')
t2 = Test('Jim')
print(t1 is t2)
print(t1.name,t2.name)
metaclass __new__
metaclass __init__
True
Tom Tom

python 类的定义 实例化 实例完后初始化的更多相关文章

  1. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  2. 在Struts.xml中的result元素指的是:指定动作类的动作方法执行完后的结果视图.

    result结果集 上一篇文章主要讲Struts2框架(4)---Action类访问servlet这篇主要讲result结果集 在Struts.xml中的result元素指的是:指定动作类的动作方法执 ...

  3. Ruby学习: 类的定义和实例变量

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

  4. Python类的定义、方法和属性使用

    类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...

  5. Python类的定义

    Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  6. python 类的定义和继承

    python 2 中类 一.类定义: ? 1 2 class <类名>:   <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性如果直接使用类 ...

  7. Python 类的属性和实例属性 Python 的动态语言

    #定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa = 10... #对类 Aa实例化出一个实例 a1>>> a1 = Aa() &g ...

  8. python 类继承与子类实例初始化

    From: https://blog.csdn.net/cs0301lm/article/details/6002504?utm_source=blogxgwz4 [ 先贴参考书籍原文(中文英文对照) ...

  9. Python类的定义与使用

    #! /usr/bin/python # Filename:objvar.py class Person: '''Represents a person.''' population = 0 def ...

随机推荐

  1. decode函数解决oracle报错"除数为0"的问题

    公司的网站在运行的时候突然报错打不开了,打开一看发现报了一个错:ORA-01476:除数为0. 网上一搜发现还是挺多人遇到这个问题的,解决办法就是用decode函数. decode是oracle内置的 ...

  2. redis数据库-VUE创建项目

    redis数据库 ''' 关系型数据库: mysql, oracle 非关系型数据库(nosql): redis,mongodb (没有表的概念) key-value mongodb: json 数据 ...

  3. IDEA主类文件需要放置在SRC文件下,非包内

    构建flash项目后,主类文件需要放置在src下,而不是在某个包内. 这样才会找到入口主类,然后有输出. 主类里面有引用其他类,需要使用 import * 全部引入.

  4. 基于Live555实现RtspServer及高清高分辨率和高码率视频传输优化

    基于Live555实现RtspServer及高清高码率视频传输优化 最近做了一些pc和嵌入式平台的RTSP服务器项目,大多数的要求是简单但是功能全面,并且性能还要强劲.综合考虑后,基本都是在基于liv ...

  5. asp.netmvc部署到linux(centos)

    介绍将asp.netmvc项目部署到centos系统. 开发工具:win10+vs2017+.NetFramework4.6.1+Vmware14+centos 1.安装Jexus 这里使用独立版(专 ...

  6. JavaWeb+SVN+Maven+Tomcat +jenkins实现自动化部署

    网址:https://blog.csdn.net/liyong1028826685/article/details/88289218 在日常开发项目中常见的开发模式是使用代码库来存放我们的项目例如:S ...

  7. 带你领略Linux系统发展及版本更迭

    Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...

  8. CTF资料

    题目大概有这么几个 web,密码学,pwn(综合渗透),misc(杂项),reverse(逆向),ppc(编程类) 入门: http://bobao.360.cn/ctf/  360的CTF训练营ww ...

  9. php处理ajax请求,ajax+php实现跨域

    第一种方法通过设置Access-Control-Allow-Origin来实现跨域 1.首先要了解什么是域? 什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域.跨 ...

  10. maven生命周期和插件详解

    生命周期 什么是生命周期? maven的生命周期就是对所有的构建过程进行抽象和统一.maven从大量项目和构建工具中总结了一套高度完善的.易扩展的生命周期.这个生命周期包含项目的清理.初始化.编译.测 ...