美文网首页
Python | 魔法属性 | 魔法方法

Python | 魔法属性 | 魔法方法

作者: CarryLili | 来源:发表于2019-08-08 18:59 被阅读0次

    前言

    在python中,以前后各有两个下划线的这种方式命名的标识符,称为魔法属性,或魔法方法,这些魔法属性或魔法方法,是python中内置的,预先定义好一些功能的属性或方法。接下来就分别介绍它们。

    init 方法的基本使用与代码解析

    • init 方法的作用是为对象进行初始化 initialization,该方法会在创建对象时,自动调用
    • 一般会将对象所具有的属性放到这个方法中,进行初始化,不在使用动态绑定为对象添加属性
    • 使用方法: self.属性名 = 值 的方式添加属性
    '''
     通过 __init__  方法来为对象进行初始化
    '''
    # 定义一个学生类
    class Student(object):
        # 实现 __init__ 方法
        def __init__(self):
            print('Init Run ...')
            # 添加属性
            self.name = 'tom'
            self.age = 12
    
    tom = Student()
    print(tom.name)
    print(tom.age)
    
    jack = Student()
    # 对属性的修改
    jack.name = 'Jack'
    print(jack.name)
    print(jack.age)
    

    结果如下:

    Init Run ...
    tom
    12
    Init Run ...
    Jack
    12
    
    问题?

    在类的方法里定义属性的固定值,则每隔对象实例变量的属性值都是相同的,有什么办法可以让实例的每个对象都有不同的属性值?

    带参数的init方法使用与代码解析

    • 通过一个类,可以创建多个对象,就好比 通过一个模具创建多个实体一样
    • init(selt)中,默认只有一个参数,如果在创建对象时传递了2个实参,那么init(selt)中出现了self作为第一个形参外,还需要2个形参,例如:init(selt,x,y) 代码解析如下:
    '''
    通过 init 方法,传入相应的参数,利用这些参数为对象的属性进行初始化
    '''
    
    class Student(object):
        # 实现 带参数的init方法
        def __init__(self, new_name,new_age):
    
            # 添加 属性
            self.name = new_name
            self.age = new_age
            print(f'{self.name} Init Run')
    
    # 实例一个对象
    tom = Student('tom',12)
    print(tom.name)
    print(tom.age)
    
    
    jack = Student('Jack',22)
    print(jack.name)
    print(jack.age)
    
    

    结果如下:

    tom Init Run
    tom
    12
    Jack Init Run
    Jack
    22
    

    str 使用方法及代码解析

    • 当使用print输出对象时,默认打印对象的内存地址。如果类定义了str(self)方法,那么就会打印从这个方法中return的数据
    • str方法通常返回一个字符串,作为这个对象的描述信息 代码解析如下:
    class Cat(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # 实现__str__ 方法
        # 该 方法必须 返回一个字符串类型的数据
        def __str__(self):
            # return f'[姓名:{self.name} 年龄:{self.age}]'
            # return f'{"name":{self.name}, "age":{self.age}}' # 因为{}的原因,所以不行
            # return '{name:%s, age: %d}' %(self.name,self.age)
            return '{' + f'name:{self.name}, age:{self.age}' + '}'
    
    
    tom = Cat('Tom', 1)
    print(tom)
    
    jack = Cat('Jack',2)
    print(jack)
    
    
    #调用str方法,把对象tom传入,得到的结果一样
    stu_string = str(tom)
    

    结果如下:

    {name:Tom, age:1}
    {name:Jack, age:2}
    #调用方法后的结果,和上面结果一样
    {name:Tom, age:1}
    {name:Jack, age:2}
    
    

    del方法使用及代码解析

    • 当删除对象后,python解释器也会默认调用一个方法,就是del()
    • 当有变量保存了一个对象的引用时,此对象的引用计数就会加1
    • 当使用del()删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0时,则对象才会被真正的删除(内存被回收)。
    '''
    __del__方法
    用来在销毁对象时自动 调用 该 方法
    '''
    
    class Cat(object):
        def __init__(self):
            self.childs = ['tom1','tom2','tom2']
    
        def __del__(self):
            # 在销毁当前对象之前,将自己管理的属性对象先销毁,回收资源
            # del self.childs
            print('Del Run ...')
    
    
    tom = Cat()
    # del tom
    
    tom.childs
    
    
    print('over')
    
    

    结果如下:

    over
    Del Run ...
    

    改变del方法代码后:

        def __del__(self):
            # 在销毁当前对象之前,将自己管理的属性对象先销毁,回收资源
            del self.childs
            print('Del Run ...')
    
    
    tom = Cat()
    del tom
    
    tom.childs
    
    print('over')
    

    删除之后结果如下:

    Traceback (most recent call last):
    NameError: name 'tom' is not defined
    Del Run ...
    

    相关文章

      网友评论

          本文标题:Python | 魔法属性 | 魔法方法

          本文链接:https://www.haomeiwen.com/subject/ppixjctx.html