Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Зачем нужен __new__ и каково его практическое применение?

#python #python_3x #классы


Зачем нужен __new__ в Python разработке и когда его использовать?   

Здесь есть хороший комментарий в 2-х словах, что такое магический метод __new__:
статический метод, вызывается когда создается экземпляр класса. В общем, сначала он,
потом __init__, думаю верно понял.   

Стыдно признаться, но ни разу не видел на практике применения этого магического метода,
даже на простом игрушечном примере это выглядит излишним.

class Foo(object):
    def __new__(cls, *args, **kwargs):
        print "Creating Instance"
        instance = super(Foo, cls).__new__(cls, *args, **kwargs)
        return instance

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def bar(self):
        pass


Может ли кто-то привести простой пример, где есть обоснованное использование __new__
и объяснить зачем он нужен и когда его нужно использовать?
    


Ответы

Ответ 1



Из официальной документации: __new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation. Здесь приведены примеры реального применения метода __new__(): Singleton class Singleton(object): _instance = None # Keep instance reference def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance проверка: In [26]: s1 = Singleton() In [27]: s2 = Singleton() In [28]: s1 is s2 Out[28]: True Пример использования в модуле pathlib (из стандартной библиотеки в Python 3.x): class PurePath(object): ... def __new__(cls, *args): """Construct a PurePath from one or several strings and or existing PurePath objects. The strings and path objects are combined so as to yield a canonicalized path, which is incorporated into the new PurePath object. """ if cls is PurePath: cls = PureWindowsPath if os.name == 'nt' else PurePosixPath return cls._from_parts(args) NOTE: если вам интересны примеры реального и правильного использования методов / функций в Python, то лучше подсмотреть как их используют авторы стандартной библиотеки Python: зайдите в директорию /Lib и поищите в каких файлах присутствует интересующий вас метод: def __new__: C:\Users\Max\Anaconda3\Lib>grep -l "def __new__(" *.py _py_abc.py _pydecimal.py _pyio.py _threading_local.py abc.py codecs.py datetime.py enum.py fractions.py functools.py pathlib.py pstats.py sre_constants.py ssl.py turtle.py typing.py weakref.py открываете найденные файлы в редакторе, находите интересующие вас строки и изучаете примеры использования от создателей Python...

Комментариев нет:

Отправить комментарий