2013-10-09 3 views
2
  1. Старый стиль класса классЧто происходит, когда вы вызываете объект .__ 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__ является лишь особенностью класса нового стиля.

 Смежные вопросы

  • Нет связанных вопросов^_^