Что происходит, когда вы вызываете 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> >>>
Новый стиль
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__
?
1 ответ
Решение
Классы старого стиля не поддерживают __new__
метод:
>>> class Foo:
... def __new__(self, *args, **kw):
... print 'Nope'
...
>>> Foo()
<__main__.Foo instance at 0x101f5c908>
__new__
это только функция класса нового стиля.