|
@@ -0,0 +1,150 @@
|
|
|
+'''
|
|
|
+__new__ - вызывается для фактического создания нового объекта.
|
|
|
+Он статический, т.к. экземпляра класса еще не существует
|
|
|
+Метод __new__ не вызывает __init__.
|
|
|
+
|
|
|
+class object:
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def __new__(cls, *more):
|
|
|
+ pass
|
|
|
+'''
|
|
|
+
|
|
|
+class Point:
|
|
|
+ def __new__(cls, *args, **kwargs):
|
|
|
+ print('Point: Создание экземпляра')
|
|
|
+ instance = object.__new__(cls)
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def __init__(self, x, y):
|
|
|
+ print('Point: Инициализация экземпляра')
|
|
|
+ self.x = x
|
|
|
+ self.y = y
|
|
|
+
|
|
|
+
|
|
|
+def test_1():
|
|
|
+ p = object.__new__(Point)
|
|
|
+ p.__init__(10, 20)
|
|
|
+ print(p)
|
|
|
+ print(type(p))
|
|
|
+ print(p.__dict__)
|
|
|
+
|
|
|
+
|
|
|
+class Point3D(Point):
|
|
|
+ def __new__(cls, *args, **kwargs):
|
|
|
+ print('Point3D: Создание экземпляра')
|
|
|
+ instance = super().__new__(cls) # вызываем через super
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def __init__(self, x, y, z):
|
|
|
+ print('Point3D: Инициализация экземпляра')
|
|
|
+ super().__init__(x, y)
|
|
|
+ self.z = z
|
|
|
+
|
|
|
+
|
|
|
+def test_2():
|
|
|
+ p = Point3D(10, 20, 30)
|
|
|
+ print(p.__dict__)
|
|
|
+
|
|
|
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+
|
|
|
+'''Создание атрибутов и методов в методе __new__'''
|
|
|
+
|
|
|
+class SquareNumber(int):
|
|
|
+ def __new__(cls, value):
|
|
|
+ return super().__new__(cls, value ** 2)
|
|
|
+
|
|
|
+
|
|
|
+def test_3():
|
|
|
+ x = SquareNumber(3)
|
|
|
+ print(x)
|
|
|
+ print(isinstance(x, int))
|
|
|
+
|
|
|
+
|
|
|
+class Square:
|
|
|
+ def __new__(cls, w, h):
|
|
|
+ # Реализация метода area
|
|
|
+ cls.area = lambda self: self.width * self.height
|
|
|
+
|
|
|
+ setattr(cls, 'perimeter', lambda self: 2 * (self.width + self.height))
|
|
|
+ instance = super().__new__(cls)
|
|
|
+ instance.width = w
|
|
|
+ instance.height = h
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def __init__(self, w, h):
|
|
|
+ self.width = w
|
|
|
+ self.height = h
|
|
|
+
|
|
|
+
|
|
|
+def test_4():
|
|
|
+ s = Square(3, 4)
|
|
|
+ print(s)
|
|
|
+ print(s.area())
|
|
|
+ print(s.perimeter())
|
|
|
+
|
|
|
+
|
|
|
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+'''Вызов __new__ в качестве статического метода
|
|
|
+object.__new__(Square, 3, 4)
|
|
|
+Square.__new__(Square, 3, 4)
|
|
|
+'''
|
|
|
+
|
|
|
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+'''Возвращаемое значение метода __new__'''
|
|
|
+
|
|
|
+class Person:
|
|
|
+ def __new__(cls, *args, **kwargs):
|
|
|
+ print(f'Создание экземпляра {cls.__name__}')
|
|
|
+ instance = super().__new__(cls)
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def __init__(self):
|
|
|
+ print(f'Инициализация экземпляра {self.__class__.__name__}')
|
|
|
+
|
|
|
+def test_5():
|
|
|
+ p = Person()
|
|
|
+
|
|
|
+'''
|
|
|
+Здесь вызов __inti__ не произойдет, т.к. __new__
|
|
|
+не возвращает экземпляр класаа
|
|
|
+'''
|
|
|
+class NewPerson:
|
|
|
+ def __new__(cls, *args, **kwargs):
|
|
|
+ print(f'Создание экземпляра {cls.__name__}')
|
|
|
+ instance = 'Hellow world'
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def __init__(self):
|
|
|
+ print(f'Инициализация экземпляра {self.__class__.__name__}')
|
|
|
+
|
|
|
+def test_6():
|
|
|
+ p = NewPerson()
|
|
|
+
|
|
|
+
|
|
|
+class BestPerson:
|
|
|
+ def __new__(cls, name, age):
|
|
|
+ instance = super().__new__(cls)
|
|
|
+ instance.name = name
|
|
|
+ instance.age = age
|
|
|
+ return instance
|
|
|
+
|
|
|
+def test_7():
|
|
|
+ p = BestPerson('Jackie Chan', 69)
|
|
|
+ print(p.__dict__)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ # test_1()
|
|
|
+ # test_2()
|
|
|
+ # test_3()
|
|
|
+ # test_4()
|
|
|
+ # test_5()
|
|
|
+ # test_6()
|
|
|
+ test_7()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|