不通过调用__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 ...
随机推荐
- Oracle保留两位小数的函数
1.最终保存成字符串类型 使用to_char()函数 // 其9代表:如果存在数字则显示数字,不存在则显示空格 // 其0代表:如果存在数字则显示数字,不存在则显示0,即占位符 // 其FM代表:删除 ...
- Pythagorean Triples 707C
Katya studies in a fifth grade. Recently her class studied right triangles and the Pythagorean theor ...
- java 实现Bridge模式(转)
原文:http://chjking.blog.163.com/blog/static/6439511120081152534252/ 看了网上一些关于咖啡加奶的例子,觉得真是天下文章一大抄,不管好的坏 ...
- Java读写avro例子
一.avro是一个数据序列化框架,可以高效得进行序列化和反序列化,支持C, C++, C#, Java, PHP, Python, 和Ruby语言.现在使用Java来读写. 二.环境搭建 1.下载av ...
- 4.Python文件操作
文件内需要写入的内容 Seems the love I’ve ever known 看来,过去我所知道的爱情 Has always been the most destructive kind 似乎总 ...
- Haskell语言学习笔记(87)Time
安装 time $ cabal install time Installed time-1.9.1 Prelude> import Data.Time Prelude Data.Time> ...
- unarjs识别组建compoment
http://stackoverflow.com/a/28210364/1070244 判断自定义元素,是否为未知元素 chrome和firefox存在差异,尤老 研究的代码 // Chrome re ...
- Nodejs 菜鸟教程学习-创建第一个应用
注:为了解学习,都是参照http://www.runoob.com/nodejs/nodejs-tutorial.html书写,做下笔记. 对于Nodejs开发来说,在开发一个应用时,我们不仅仅是实现 ...
- 24.类的加载机制和反射.md
目录 1类的加载连接和初始化 1.1类的加载过程 1.2类的加载器 1.2.1类的加载机制 1类的加载连接和初始化 1.1类的加载过程 类的加载过程简单为分为三步:加载->连接->初始化 ...
- php urldecode 与rawdecode
php urldecode 解码给出的已编码字符串中的任何 %##. 加号('+')被解码成一个空格字符 php rawurldecode 返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都 ...