不通过调用__Init__来创建实例
老样子,抛出个问题,我们想要创建一个实例,但是由于某些原因想绕过__init__方法,用别的方式来进行创建。
举个栗子
小贱贱反序列化数据,或者说实现一个类方法将其作为备选的构造函数,都属于这种情况。举个栗子:
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
采用下面的方法可以不用调用__init__()创建一个Date实例:
d = Date.__new__(Date)
但是注意,此时使用d.year就会给你报个错
因为得到的实例是未经初始化的,因此给实例变量设定合适的初始值现在就成了我们的责任。
ok……在下面的例子中给出:
from time import localtime class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day @classmethod
def today(cls):
d = cls.__new__(cls)
t = localtime()
t.year = t.tm_year
t.month = t.tm_mon
t.day = t.tm_mday
return d
类似的,假如正在反序列化JSON数据,要产生下面酱紫的字典:
要产生类似字典的数据咋搞呢?
from time import localtime class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day @classmethod
def today(cls):
d = cls.__new__(cls)
t = localtime()
T = {}
T['year'] = t.tm_year
T['month'] = t.tm_mon
T['day'] = t.tm_mday
for key, value in T.items():
setattr(d, key, value)
return d
x = Date(2018,6,5)
youxi=x.today()
print(youxi.year, youxi.month, youxi.day)
总结:
当通过非标准方法去创建实例的时候,最好不要对他们的实现做过多的假设,不要直接操作底层的字典__dict__的代码,除非你保证它完全被定义了,否则,一旦类中使用了
__slots__、proprety属性、描述符(魔术方法),那么你的代码就会崩溃。通过使用setattr()来为属性定值,代码就会尽可能的通用。
不通过调用__Init__来创建实例的更多相关文章
- WCF 动态调用(动态创建实例接口)
很多时候,服务地址都不止一个的,这个时候就要动态去配置地址.配置Web.config,很麻烦 下面就看看怎样实现动态调用WCF. 首先看看动态创建服务对象的代码: using System; usin ...
- C#反射动态创建实例并调用方法
在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...
- python之定义类创建实例
https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...
- python 创建实例--待完善
今天好好琢磨一下 python 创建实例的先后顺序 一. 就定义一个普通类 Util (默认)继承自 object,覆写 new ,init 方法 class Util(object): def __ ...
- python基础教程:定义类创建实例
类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 >>>class Person(object): #所有的类都是从object类继承 pass #pass ...
- [转] Autofac创建实例的方法总结
1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...
- C#:控制台程序调用中间库创建窗体
1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...
- Autofac创建实例的方法总结 【转】
Autofac创建实例的方法总结 1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure t ...
- Spring通过工厂创建实例的注意事项
假设第三方(or别的team)提供一个工厂类(此类是不能够改动的.往往以jar包形式提供的),须要供给我们项目来使用. 可是我们自己的项目使用了spring来配置,所以我们当然希望可以通过spring ...
随机推荐
- Navicat Premium 连接Oracle 数据库(图文教程)
一.需要准备的软件 Navicat premium 32位 官方下载地址:http://www.navicat.com.cn/products/navicat-premium Instant Clie ...
- 与前端对接 jsonp
主要是回调的写法,前端人员接受的数据格式 参数 (jsonString);
- UnicodeDecodeError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128)
待研究: compressed_data = zlib.compress(json.dumps(data), 9) file_data = MySQLdb.escape_string(compress ...
- pbft流程深层分析和解释(转)
<1>pbft五阶段请求解释 Request pre-prepare prepare commit 执行并reply (1)pre-prepare阶段: 主节点收到客户端请求, ...
- java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
Hibernate4.x与spring3.x整合,有关事务的处理,用Junit4测试,出现org.springframework.beans.factory.BeanCreationException ...
- [PHP]PHP的session机制,配置与高级应用
---------------------------------------------------------------------------------------------------- ...
- adb INSTALL_FAILED_UPDATE_INCOMPATIBLE
今天用Eclipse运行项目时出错: LOG: [2018-05-09 14:16:19 - Module_Android_Demo] ------------------------------ [ ...
- HttpURLConnection 添加代理
//创建代理服务器 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("www.proxyaddress.com& ...
- 在前台页面写java代码,导入java的包
- Python学习第二步骤
第一步的基本的语法,在Linux或者mac(别喷)上直接输入Python,查看版本,如果显示就是已经内置了 第二步当然是进行数据库的操作了 我选择的是mysql 那几个踩到的雷 分别是: 1:MySQ ...