当你调用object .__ new__时会发生什么?

时间:2013-10-09 13:56:33

标签: python inheritance new-operator new-style-class

  1. 旧式课程

    class Person():
        _names_cache = {}
        def __init__(self,name):
            self.name = name
        def __new__(cls,name):
            return cls._names_cache.setdefault(name,object.__new__(cls,name))
    
    ahmed1 = Person("Ahmed")
    ahmed2 = Person("Ahmed")
    print ahmed1 is ahmed2
    print ahmed1
    print ahmed2
    
    
    >>> False
    <__main__.Person instance at 0xb74acf8c>
    <__main__.Person instance at 0xb74ac6cc>
    >>>
    
  2. 新式课程

    class Person(object):
        _names_cache = {}
        def __init__(self,name):
            self.name = name
        def __new__(cls,name):
            return cls._names_cache.setdefault(name,object.__new__(cls,name))
    
    ahmed1 = Person("Ahmed")
    ahmed2 = Person("Ahmed")
    print ahmed2 is ahmed1
    print ahmed1
    print ahmed2
    
    >>> True
    <__main__.Person object at 0xb74ac66c>
    <__main__.Person object at 0xb74ac66c>
    >>>
    
  3. 我想了解当我致电object.__new__时,两个版本的代码会发生什么?

1 个答案:

答案 0 :(得分:3)

旧式类不支持 __new__方法:

>>> class Foo:
...     def __new__(self, *args, **kw):
...         print 'Nope'
... 
>>> Foo()
<__main__.Foo instance at 0x101f5c908>

__new__只是一种新式的课程功能。