• Python 的 __new__() 方法与实例化

    本文主要转自:http://www.cnblogs.com/ifantastic/p/3175735.html

    __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例

    如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而__new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。

    __new__() 方法的特性:

    • __new__() 方法是在类准备将自身实例化时调用
    • __new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器

    类的实例化和它的构造方法通常都是这个样子:

    正如以上所示,一个类可以有多个位置参数和多个命名参数,而在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法:

    第一个参数cls是当前正在实例化的类。

    如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法。例如,如果当前类是直接继承自 object,那当前类的 __new__() 方法返回的对象应该为:

    注意:
          事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
          而如果新式类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__()方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。具体看以下代码解释:

    通常来说,新式类开始实例化时,__new__()方法会返回cls(cls指代当前类)的实例,然后该类的__init__()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,然后依次传入__new__()方法中接收的位置参数和命名参数。

    注意:如果__new__()没有返回cls(即当前类)的实例,那么当前类的__init__()方法是不会被调用的。如果__new__()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法【不包括__init__()方法】

    ================ 以上是转载的原文 =========================

    下面是我的一点使用经验。此前我也没具体使用过__new__()方法,只是大概听过有这么一个事。

    最近项目新增了一种网络协议,而API不变,希望同时适配不同的网络协议(数据包中有给出版本号可以判断)。然后就想到了在实例化的__new__()方法里面返回一个其他类的实例,进而拜读了原文……

     

    粗略阅读原文后,写出来了类似这样的代码:

    运行结果为:

    A这块是正常的,而B这块就很不正常了:没有value这个属性不说,print(‘B new’) 都没有执行!
    ——这是 return object.__new__(B) 导致的,因为object的__new__() 方法没有 print(‘B new’) 这句。

    我们把 return object.__new__(B) 改成 return B.__new__(cls) ,像这样:

    这下执行结果有显示 B new 了。然而,’B’ object has no attribute ‘value’,还是没有。
    把 return B.__new__(cls) 改为 return B.__new__(cls, *args, **kwargs) ,把参数传进去,结果还是一样。

    难道是B类的问题?把它改成:

    依旧报错(在Python 3下还会报 TypeError: object() takes no parameters)!有点抓狂了,再去精读一下,发现了上面被我标红的一句“如果__new__()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法”。就是说,__init__()方法没有被调用啊!我来手动调用一下:

    这次终于和期望一致了……

     

    总结:

    1. 如果__new__()返回其他类的实例,那么只会调用被返回的那个类的构造方法【不包括__init__()方法】;
    2. 如果__new__()返回当前类的实例,可以直接 return object.__new__(cls) ,不需要手动传参数;若返回其他类的参数,需 return ClassName.__new__(cls, *args, **kwargs) 手动传参数,万万不能 return object.__new__(ClassName, *args, **kwargs) 。
  • 游戏策划:为什么我的儿子不沉迷游戏?

    今天是高考第一天,越来越多的家长问我孩子网瘾的问题。

    我作为一名从业多年的资深游戏策划,首先得说个现实,商业化的网络游戏,无不是为让玩家沉迷所设计的。

    为了让玩家沉迷,我们做的功课比各位父母要深入的多,这根本不是一个维度的对抗,所以无奈是大多数父母的感受。

    我们非常清楚你的儿子想要什么,愿意付出什么,以及什么是他喜欢的。百万玩家的数据和调研在我们的数据平台上随时可查,我们的每一个改动都和数据有关,我相信我比你更了解你的儿子的喜好。

    作为一个游戏策划,这是我的工作,但作为一个家长,我儿子也读小学了,但他却没有对游戏成瘾。

    说句不好听的,引导玩家和教育儿子没有本质的区别,而在引导玩家这件事上,我经验丰富。

    阅读更多…

  • 十年经历第7次易主 有了钱和技术的A站会回春吗

    动荡不安的A站终于迎来了第7次易主。在抛来橄榄枝的阿里、今日头条、快手三家中,经过半年多的复杂谈判与斡旋,A站最终选择被快手全资收购。这也意味着,A站将打破股东及管理层混乱局面:结束奥飞系的蔡东青、软银中国、优酷土豆和中文在线四大股东的复杂关系,拥有一家普通公司该拥有的稳定运营管理结构。

    文/彭丽慧网易科技

    未来,A站将保持独立品牌、维持独立运营、保持原有团队、独立发展。而快手也会在资金、资源、技术等给予A站大力支持。那么,还想再活五百年的A站真能如所愿吗?

    阅读更多…

  • 搭建 git 本地中转站

    局域网内有多台开发机器,因为种种原因,与服务器同步代码有不便之处。于是打算在本地做一个 git 的镜像,所有机器都统一 clone 这个本地镜像库,然后由这个镜像库负责与服务器更新。

    1. 使用 –mirror 参数 clone

    执行以上命令后,在本地的 /some/where/someproject.git/ 下建立了对应项目的镜像,它是一个裸版本库(不包含工作区,直接就是版本库的内容),对于我这样的新手来说不是很好懂什么是“裸版本库”,但是进去目录看一下就知道了。

    2. 本地操作

    在同一台机器上,我们这样写代码:

    这样 clone 出来的就是平时熟悉的、包含工作区的内容,平时怎么用就怎么用。
    阅读更多…

  • 申请 Let’s Encrypt 通配符 HTTPS 证书,并配置 Apache2

    3月中旬, Let’s Encrypt 终于正式发布通配符 HTTPS 证书了,赶紧去申请一个玩玩(然而我的网站暂时还不支持加SSL,只能先在VPS上试试了 /(ㄒoㄒ)/)。

    1. 安装 Let’s Encrypt 客户端

    系统为 Ubuntu 16.04,参照 Certbot 官网的教程,运行以下命令安装(我这里由于是用 root 用户,所以非 root 请自行加 sudo):

    2. 获取通配符证书

    先查看 certbot 的版本是否 > 0.22,否则不支持通配符证书:

    自带的 –apache 模式似乎并不能处理通配符证书的情况,所以需要手动获取。

    在对应的 support 页面[1]中,了解到还需要手动指定服务器,执行:

    之后按提示操作,并添加自己的域名的 TXT 记录,以通过 ACME 认证。完成后,可在 /etc/letsencrypt/live/xxxx.com/ 下看到几个 .pem 文件。

    阅读更多…

  • 壮士A站:宁可”断腕”关闭 也不收用户一分钱

    转载自:http://www.cnbeta.com/articles/tech/695807.htm

    60年的约定或许就要成空。2月2日10点30分,ACFUN(下称“A站”)的网页显示为无法打开,app上一片空白。其实,这次A站药丸的消息,在两天前就被传出来了。只是这一回,A站不是遭受“不可描述的混沌入侵”,也不是“猴子(A站员工昵称)又用服务器下片了”。这个已经陪伴了大家十年的祖师级中国二次元网站,又一次到了生死关头。

    文|张潇潇

    宁可关闭也不收用户一分钱的A站,真的走到尽头了吗?

    生死之间

    1月31日左右,微博和知乎上有A站员工表示,A站已经拖欠员工工资近三个月,且并未给出解释,社保也需由员工自己缴纳。拖欠工资导致部分老员工离职,而离职员工的工资也未发放。

    31日晚间,有媒体发布了A站融资不畅,拖欠200多名员工工资的消息。这则消息中的另外一个信息更让人揪心:A站的由提供,但在1月31日晚上12点就到期,如果不能按时续费,A站将被关停服务器。

    消息一出,各大二次元ACG群立即炸开了锅,“猴山真的要倒闭了吗?” A站药丸已经是月经话题了,A站经常因为技术问题炸站,次数频繁到被网友称为“A站大姨妈来了”。关于A站的传闻也从“公司拉闸限电”传到了“A站被清除出北京了”。可是这一次,A站是连服务器续费的钱都拿不出了,连猴子的工资都发不出了,大家担心,A站可能真的要凉。在焦虑中,所有人等着12点的到来。

    12点到了,A站一切如常。

    12分钟后,A站的官方微博发了一个斜着眼笑的“喵喵”表情,用官微一贯“认真你就输了”的吊儿郎当态度,得瑟地告诉外界,A站没事,还活着。但是这个得意的表情只持续了34个小时零18分钟。

    阅读更多…

  • 在OpenWrt中使用iptables过滤特定字符串

    当前的需求如下:需要选择性地过滤掉远程客户端向NAT下的服务器发送的特定请求。
    网络拓扑:Client—Internet—WAN–OpenWrt Router–LAN–Server

    经过实践,方法如下:

    在执行命令后,在LAN抓包,发现对应的数据包果然不见了,证明命令生效。再执行后续的命令,在LAN抓包,又可恢复正常的不丢包状态。

    对于其他网络拓扑,可把FORWARD链改为INPUT或OUTPUT。

  • 在cmd中使用echo输出空行

    众所周知,在Windows的cmd中,echo可以用来输出信息,但如果想输出空行,用“echo 加空格”的方法,无论加多少个空格都是不行的,都相当于“echo”,而返回当前的echo状态(on/off)。

    找了一下,方法至少有10种:

    这10种方法可以分为三组,每组的效率依次递减。至于为什么效率会低,可参考本文转载的出处。

    简而言之,要输出一个空行,用第一组的 “=” “,” “;” 紧接在echo后面,是最好的选择。

    转载自 http://www.jb51.net/article/30987.htm

  • 【全明星鬼畜剧】功守道

    非常好的鬼畜剧,极佳地对应了全明星各自的特点,良心推荐

    阅读更多…

第 1 页,共 37 页12345...102030...最旧 »