Python | 魔法属性 | 魔法方法
2019-08-08 本文已影响0人
CarryLili
前言
在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 ...