python入门09——魔法方法(__XXX__())

一、常用的方法

1. __init__方法

__init__方法是专门用来定义一个类具有哪些属性的方法。

当使用 类名() 创建对象时,会自动执行以下操作:
    1.为对象在内存中分配空间 —— 创建对象
    2.为对象的属性设置初始值 —— 初始化方法(init)
这个 初始化方法 就是 __init__() 方法,是对象的内置方法。其结构如下所示:

def __init__(self):
    self.data = []

类定义了 __init__() 方法,类的实例化操作会自动调用 该方法。如下实例化类 MyClass,对应的 __init__()方法就会被调用:

x = MyClass()

__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。如下实例所示:

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart


x = Complex(3.0, -4.5)  # 这两个实参分别传到realpart和imagpart中去
print(x.r, x.i)  # 输出结果:3.0 -4.5

应用场景: 开发中,如果希望在创建对象的同时就设置对象的属性。我们可以把希望设置的属性值,定义成__init__ ()的参数,然后在方法内部使用 self.属性 = 形参 接收外部传递的参数。在创建对象时,使用 类名(属性1, 属性2...) 调用即可。

2. __new__方法

__new__() 是一种负责创建类实例的静态方法,它无需使用 staticmethod 装饰器修饰,且该方法会优先 __init__() 初始化方法被调用。

class demoClass:
    instances_created = 0

    def __new__(cls, *args, **kwargs):
        print("__new__():", cls, args, kwargs)
        instance = super().__new__(cls)
        instance.number = cls.instances_created
        cls.instances_created += 1  
        return instance

    def __init__(self, attribute):
        print("__init__():", self, attribute)
        self.attribute = attribute


test1 = demoClass("abc")
test2 = demoClass("xyz")
print(test1.number, test1.instances_created)
print(test2.number, test2.instances_created)

该例参考@http://c.biancheng.net/view/5484.html,其运行结果为:
在这里插入图片描述
由该例可以看出系统优先执行__new__()方法,然后再执行 __init__() 方法。
那我们什么时候才会使用到__new__()呢,答案其实很简单,一般是在__init__() 不够用时。例如对 Python 不可变的内置类型(如 int、str、float 等)进行了子类化,这是因为一旦创建了这样不可变的对象实例,就无法__init__() 方法中对其进行修改

class CapStr(str):  # 该类继承str,但是str类型中不自带转变为大写的方法
    def __new__(cls, string):
        string = string.upper()  # 想要对str类型转成大写
        return str.__new__(cls, string)

a = CapStr('I love zhangyixing!')
print(a)
# I LOVE ZHANGYIXING!
3. __del__方法

在 Python 中,当使用 类名() 创建对象时,为对象分配完空间后,会自动 调用 __init__ 方法。那么同样地,当一个对象从内存中被销毁前,会自动调用 __del__ 方法。

class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了,此时调用的是__init__方法" %<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值