python 魔法方法 __init__与__new__

在python中 定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化。(更通俗的说就是你创建该类该类附加的功能 比如说你家狗狗刚出生,就会去找麻麻喝奶~)当我们的实例对象有明确的初始化步骤的时候你可以在__init__中部署初始化代码

# 我们定义一个矩形类,需要长和宽两个参数,拥有计算周长和面积两个方法。
# 我们需要对象在初始化的时候拥有“长”和“宽”两个参数,因此我们需要重写__init__方法
# 因为我们说过,__init__方法是类在实例化成对象的时候首先会调用的一个方法,大家可以理解吗?


class Rectangle:
        def __init__(self, x, y):
                self.x = x
                self.y = y
        def getPeri(self):
                return (self.x + self.y) * 2
        def getArea(self):
                return self.x * self.y


>>> rect = Rectangle(3, 4)
>>> rect.getPeri()
14
>>> rect.getArea()
12

注:__init__方法返回 一定为none所以说 在__init__方法中 return 会报错

在类的内部,访问自己的属性和方法,都需要通过self,self就是外部对象在类内部的表示,此时可以使用p调用该方法

self 呢?self不需要传参,self,表示对象本身, 谁调用,就表示谁 ,此时的self就表示你Rectangle (3,4) 创造出来的那个对象,也即是 rect 。也即,我们创造出了rect,然后给rect的属性赋了值,此时rect就表示拥有属性值之后的那个矩形。

二、__new__方法

python new方法是python一个对象实例化时所调用的第一个方法(不是__init__哦)而且它的参数不是self 而是一个类(cls)

>>> class GreStr(str):#将随便输入的字符串全部转化为大写输出
	def __new__(cls,string):
		string = string.upper()
		return str.__new__(cls,string)

	
>>> a = GreStr('asdasdasd')
>>> a
'ASDASDASD'
>>> 
这里大家估计会不明白为什么会return str.__new__(cls,string) 因为GreStr 继承的str类 是python 类 本身无法改变 (不能直接改变str类里的方法)所以 当你创建GreStr 实例对象的时候 先调用__new__方法 自动将你传入的字符 转化成大写 然后因为系统里 本身是由str类的 只需要调用 str.__new__(cls,string)将刚刚改变的string 传入str类中的new方法即可



猜你喜欢

转载自blog.csdn.net/qq_28724561/article/details/80419969
今日推荐