python 类的定义 实例化 实例完后初始化
先来看看 类的__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 类的定义 实例化 实例完后初始化的更多相关文章
- python类的定义和使用
python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...
- 在Struts.xml中的result元素指的是:指定动作类的动作方法执行完后的结果视图.
result结果集 上一篇文章主要讲Struts2框架(4)---Action类访问servlet这篇主要讲result结果集 在Struts.xml中的result元素指的是:指定动作类的动作方法执 ...
- Ruby学习: 类的定义和实例变量
ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...
- Python类的定义、方法和属性使用
类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...
- Python类的定义
Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- python 类的定义和继承
python 2 中类 一.类定义: ? 1 2 class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性如果直接使用类 ...
- Python 类的属性和实例属性 Python 的动态语言
#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa = 10... #对类 Aa实例化出一个实例 a1>>> a1 = Aa() &g ...
- python 类继承与子类实例初始化
From: https://blog.csdn.net/cs0301lm/article/details/6002504?utm_source=blogxgwz4 [ 先贴参考书籍原文(中文英文对照) ...
- Python类的定义与使用
#! /usr/bin/python # Filename:objvar.py class Person: '''Represents a person.''' population = 0 def ...
随机推荐
- C#用正则表达式替换手机中间几位为*号 代码及解析
/// <summary> /// 替换手机号中间四位为* /// </summary> /// <param name="phoneNo">& ...
- XAMPP启动Apache时发生ERROR
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非常容易安装和 ...
- python 变量之小整数池跟大整数池
在python中定义变量会有:id,type,value.对于==比较的是value,对于is比较的是id. 因此,对于相同value的变量,它的type相同,但是它的id值可能不一样.对于相同id的 ...
- dubbo基础学习总结
Dubbo基本原理机制 分布式服务框架: –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省 ...
- linux常用命令 awk命令
awk命令 awk [选项] '条件1{动作1} 条件2{动作2}...' 文件名 条件(Pattern) *) 一般使用关系表达式作为条件 *) x>10 判断变量x是否大于10 *) x&g ...
- JS数组映射保存数据-场景
开发遇到,写个随笔,以防我的金鱼记忆 场景:一个页面从后台拿到20条数据,把他们展现在页面上,当点击某一个item时,需要展示这个item的详情,通常不会去把页面调走,就在本页面通过 display: ...
- 01-Devops核心要点及Kubernetes架构概述
Brog 自动装箱,自动修复,水平扩展,服务发现和负载均衡,自动发布和回滚 密钥和配置管理,存储编排,批量处理执行
- devexpress—WPF
https://docs.devexpress.com/WPF/7875/index Ocelot 资源汇总 https://www.cnblogs.com/shanyou/p/10363360.ht ...
- css制作倒三角
布局div,并命名为id="dropdown",在style使用border属性对div进行控制 #dropdown{ width:0px; height:0px; border- ...
- linux&Mysql
安装iptable yum install iptables-services --- 安装并解压相关文件到mysql /usr/local/mysql --- 配置 未完待续(由于阿里云已经安装好我 ...