python精要(65)-类(2)-构造函数
__init__(self[, ...])在實例創(chuàng)建( *__new__()*)之后調(diào)用,但在實例返回給調(diào)用方之前調(diào)用。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Feb 22 08:35:42 2021@author: myhaspl """class Point:def init(self):self.x=0self.y=0def set(self,x,y):self.x=xself.y=ydef setFromPoint(self,point):self.x=point.xself.y=point.yb=Point() b.init() b.set(101, 102) a=Point() a.init() print(a) print(a.x) print(a.y) a.set(12,31) print(a) print(a.x) print(a.y) a.setFromPoint(b) print(a) print(a.x) print(a.y)1、通過def定義新的方法
2、可向類中方法,傳入實例
3、使用__init__作為構(gòu)造函數(shù)
4、也可使用__new__作為構(gòu)造函數(shù)
(1)僅一個參數(shù)
(2)沒有self參數(shù),因此,在構(gòu)造對象之前調(diào)用,因此,它必須返回新創(chuàng)建的對象。
調(diào)用以創(chuàng)建類cls的新實例。__new __()是一個靜態(tài)方法(特殊情況下,您不必聲明它),它將請求實例的類作為其第一個參數(shù)。其余的參數(shù)是傳遞給對象構(gòu)造函數(shù)表達式(對類的調(diào)用)的參數(shù)。new()的返回值應(yīng)該是new object實例(通常是cls的實例)。
典型的實現(xiàn)創(chuàng)建一個類的新實例,方法是使用super()調(diào)用超類的 new() ,使用適當?shù)膮?shù)調(diào)用super().new(cls[, …])
Point類沒有定義繼承的父類,因此,其父類為object,因為所有python類都是object的子類。
如果在對象構(gòu)造過程中調(diào)用了 __new__() ,并且它返回了cls的一個實例或子類,那么新實例的__init__() 方法將像 __init__(self[, ...]),其中self是新實例,其余參數(shù)與傳遞給對象構(gòu)造函數(shù)的參數(shù)相同。
如果_new__()不返回cls的實例,則不會調(diào)用新實例的__init__() 方法。
new()主要用于允許不可變類型(如int、str或tuple)的子類自定義實例創(chuàng)建。為了自定義類的創(chuàng)建,它通常在自定義元類中被重寫。
構(gòu)造單例
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Feb 22 08:35:42 2021@author: myhaspl """class Point:def __new__(cls):'new調(diào)用此方法后,'if not hasattr(cls, 'instance'):cls.instance=super(Point, cls).__new__(cls)return cls.instance def __init__(self)print("init")def set(self,x,y):"設(shè)置點對象的坐標值"self.x=xself.y=yb=Point() b.set(101, 102) print(b.x) print(b.y)a=Point() a.set(1010, 1020) print(a.x) print(a.y) print(b.x) print(b.y)此時對Point()的多次調(diào)用,永遠只返回一相同的實例
init 101 102 init 1010 1020 1010 1020總結(jié)
以上是生活随笔為你收集整理的python精要(65)-类(2)-构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-Plus——增删查改
- 下一篇: SpringBoot 使用AOP功能