__new()__与__init__()
1. __new__:创建对象时调用,会返回当前对象的一个实例。(默认情况下也就是你在类中没有没有重新这个方法,会默认返回当前类的示例,如果你重写了这个方法,但是在方法中没有返回当前类的示例,那么也就是说没有创建对象,也就不会执行init方法)
2. __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值。(只有在__new__方法中返回当前类的示例时,才会自动执行)
3. 在类中,如果__new__和__init__同时存在,会优先调用__new__。
class NameInfo:
def __new__(cls, *args, **kwargs): # 创建对象的时候执行
print('__new__')
# return super(NameInfo, cls).__new__(cls) # 如果注释不执行,不会执行init方法,因为没有返回类的示例,在实例化类时,也不会创建出对象
def __init__(self, name, *args, **kwargs): # 初始化对象的时候执行
self.name = name
print("__init__")
@property
def get_name(self):
return self.name
@get_name.setter
def get_name(self,new_name):
self.name = new_name
if __name__ == "__main__":
alex = NameInfo('ALEy')
2. __new__()方法还可以用来实现单例模式
class NameInfo:
def __new__(cls, *args, **kwargs): # 创建对象的时候执行
if not hasattr(cls, 'instance'):
# 创建实例
cls.instance = super(NameInfo, cls).__new__(cls)
# print(cls.instance)
return cls.instance
def __init__(self, name, *args, **kwargs): # 初始化对象的时候执行
self.name = name
print("__init__")
if __name__ == "__main__":
alex = NameInfo('ALEy')
eric = NameInfo('eric')
print(id(alex))
print(id(eric))
C:\python35\python.exe D:/workspace/spider/text.py
>>>> __init__
>>>> __init__
>>>> 2947617811816
>>>> 2947617811816
参考文档:https://www.cnblogs.com/jayliu/p/9013155.html
__new()__与__init__()的更多相关文章
- [译]为什么在__new __()后总是调用__init __()?
原文来源: https://stackoverflow.com/questions/674304/why-is-init-always-called-after-new 需要控制新实例的创建时,请使用 ...
- Python - 面向对象编程 - __new()__ 和单例模式
单例模式 这是一种设计模式 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 单 ...
- Python入门基础(9)__面向对象编程_3
继承 子类自动继承父类的所有方法和属性 继承的语法: class 类名(父类名) pass 1.子类继承父类,可以直接使用父类中已经封装好的方法,不需要再次开发 2.子类可以根据需求,封装自己特有的属 ...
- Python核心编程-细节
直接从六张开始看看书里有什么. cmp() len() max() and min() sorted() and reversed() enumerate() and zip() sum() list ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- Python基本特殊方法之__new__
__new__()和不可变对象 __new__方法的一个用途是初始化不可变对象,__new()__方法中允许创建未初始化的对象,这允许我们在__init__()方法被调用之前先设置对象的属性 例:为f ...
- python 特殊方法之new
object.__new__(cls[, ...]) Called to create a new instance of class cls. __new__() is a static metho ...
- python中几个常见的魔法方法
首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...
- Python基础:18类和实例之二
1:绑定和非绑定 当存在一个实例时,方法才被认为是绑定到那个实例了.没有实例时方法就是未绑定的.在很多情况下,调用的都是一个绑定的方法. 调用非绑定方法并不经常用到,其中一个主要的场景是:派生一个子类 ...
随机推荐
- A Pythonic Card Deck: __len__ & __getitem__ & for 循环的嵌套
1. 列表生成式的嵌套 for 循环: 示例如下: li1 = range(1,6) li2 = list("ABC") # list("ABC") 的结果为 ...
- Sql Server 导出数据库表结构的SQL查询语句
--导出数据库所有表 SELECT 表名 Then D.name Else '' End, 表说明 Then isnull(F.value,'') Else '' End, 字段序号 = A.colo ...
- 4.ID主键生成策略
保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- Scrapy框架之高级 转
一.CrawlSpider模板 创建项目 scrapy startproject 项目名称 查看模板 scrapy genspider -l 创建crawl模板 scrapy genspider -t ...
- PAT1005 继续(3n+1)猜想
卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...
- zoomeye使用
简介 ZoomEye是一款针对网络空间的搜索引擎,收录了互联网空间中的设备.网站及其使用的服务或组件等信息. ZoomEye 拥有两大探测引擎:Xmap 和 Wmap,分别针对网络空间中的设备及网站, ...
- Myeclipse中左边的项目目录没了
切换一下Perspective, java, resource都有项目窗口 具体的 Window->Open Perspective 如果项目窗口被关了的话 windows->show v ...
- Android Studio Terminal 常用命令
一.Manifest merger failed with multiple errors, see logs 在android开发的时候,有时候会遇到这样的问题 Error:Execution fa ...
- input和textarea的区别
区别: <textarea>标签是成对的,有结束标签进行闭合,标签的内容写在标签对中间:<input>是单个标签,标签的内容通过 value 属性设置: <textare ...
- windows10家庭版远程桌面连接报错:CredSSP加密oracle修正
转 原地址:https://www.cnblogs.com/lindajia/p/9021082.html Windows10远程桌面连接 报错信息 : 网上找到方法 但是奈何是 "Win1 ...