当前位置 博文首页 > python不同版本的_new_不同点总结

    python不同版本的_new_不同点总结

    作者:小妮浅浅 时间:2021-08-05 18:24

    我们都知道python的版本不同,在使用的时候就有所区别。鉴于我们推荐小伙伴们选择python3版本,所以这方面的区别了解的不是很多。就拿_new_来说,在python2和3中的写法是不一样的,之前有接触_new_的小伙伴想必没有注意到这个问题。接下来讲讲new的基本用法,然后就python不同版本中_new_的区别带来详解。

    new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。

    class Person(object):
      """Silly Person"""
      def __new__(cls, name, age):
        print '__new__ called.'
        return super(Person, cls).__new__(cls, name, age)
      def __init__(self, name, age):
        print '__init__ called.'
        self.name = name
        self.age = age
      def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)
    if __name__ == '__main__':
      piglei = Person('piglei', 24)
    print piglei

    Python3和 Python2中__new__使用不同

    Python3的写法

    class Singleton(object):
      def __new__(cls,*args, **kwargs):
        if not hasattr(cls,'_inst'):
          print(cls)
          cls._inst = super(Singleton, cls).__new__(cls)
        return cls._inst

    如果Python3的写法跟Python2写法一样,那么倒数第二行会报错

    "TypeError: object() takes no parameters"

    根据上面的运行结果我们可以发现,在python3中强行使用python2的写法是不可行的。

    Python __new__()知识点扩充

    __new__() 是一种负责创建类实例的静态方法,它无需使用 staticmethod 装饰器修饰,且该方法会优先 __init__() 初始化方法被调用。

    一般情况下,覆写 __new__() 的实现将会使用合适的参数调用其超类的 super().__new__(),并在返回之前修改实例。例如:

    class demoClass:
      instances_created = 0
      def __new__(cls,*args,**kwargs):
        print("__new__():",cls,args,kwargs)
        instance = super().__new__(cls)
        instance.number = cls.instances_created
        cls.instances_created += 1
        return instance
      def __init__(self,attribute):
        print("__init__():",self,attribute)
        self.attribute = attribute
    test1 = demoClass("abc")
    test2 = demoClass("xyz")
    print(test1.number,test1.instances_created)
    print(test2.number,test2.instances_created)

    输出结果为

    __new__(): <class '__main__.demoClass'> ('abc',) {}
    __init__(): <__main__.demoClass object at 0x0000026FC0DF8080> abc
    __new__(): <class '__main__.demoClass'> ('xyz',) {}
    __init__(): <__main__.demoClass object at 0x0000026FC0DED358> xyz
    0 2
    1 2

    jsjbwy
    下一篇:没有了