2013-10-09 36 views
2
  1. 旧式类当你调用object .__ new__时会发生什么?

    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> 
    >>> 
    

我想了解的代码的两个版本会发生什么,当我打电话object.__new__

回答

3

老式类不支持一个__new__方法:

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

__new__只是一个新式类的功能。

相关问题