Python | 魔法属性 | 魔法方法

2019-08-08  本文已影响0人  CarryLili

前言

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

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

'''
 通过 __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 方法,传入相应的参数,利用这些参数为对象的属性进行初始化
'''

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 使用方法及代码解析

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方法使用及代码解析

'''
__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 ...
上一篇下一篇

猜你喜欢

热点阅读