魔术方法

一种特殊的方法而已。

特点:不需要人工调用,在特定的时刻自动执行。

__init__初始化魔术方法

1.触发时机:实例化对象之后触发

2.作用:为对象添加对象的所属成员。

3.参数:一个self 接受当前对象 其他的参数根据实例化的传参决定

4.返回值:无

5.注意事项:无

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Human:
#属性
eye = 2
skin = 'yellow'

#方法
#魔术方法__init__
def __init__(self,kidname,petname):#petname init的形参
#print('init方法被执行')
#为对象添加成员
self.sex = '男'
self.age = 1
self.name = kidname
self.petname = petname #self.petname 对象的成员

def eat(self):
print('吃饭方法')
def run(self):
print('跑步方法')
def sleep(self):
print('睡觉方法')

#实例化一个人的对象
one = Human('邓玉琪','妮妮')#实例化对象 【1.制作一个对象 2.为对象初始化操作】
print(one.__dict__)#打印对象成员
print(one)

__new__构造方法

1.触发时机:实例化对象的时候触发!

2.作用:管理控制对象的生成过程。

3.参数:一个cls接受当前类,其他的参数根据实例化的参数决定

4.返回值:可有可无 没有返回值,实例化结果为None

5.注意事项:new魔术方法跟init的魔术方法的参数一致(除了第一个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Human:
#属性
eye = 2
skin = 'yellow'

#魔术方法 (重载object内部自带的__new__)
def __new__(cls,sex):
#print('new方法被触发')
#print(cls)
#自己控制对象的生成过程(女的生,男的不生)
if sex == '女':
#生成对象并且返回
return object.__new__(cls)#上帝之手
else:
#不生成对象
return None

def eat(self):
print('吃饭方法')

def run(self):
print('跑步方法')

def sleep(self):
print('睡觉方法')

#实例化对象
one = Human('男') # 实例化对象 【1.制作一个对象 (new)2,初始化对象 (init)】
print(one)

__del__析构方法

1.触发时机:对象被系统回收的时候自动触发(del时不触发,结束后触发)

2.作用:回收程序使用过程的信息和变量等

3.参数:一个self接收当前对象

4.返回值:无

5.注意事项:无

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Human:
#属性
eye = 2
skin = 'yellow'

#方法
def eat(self):
print('吃饭方法')
def run(self):
print('跑步方法')
def sleep(self):
print('睡觉方法')

#析构方法
def __del__(self):
print('del方法被触发')

#实例化一个对象
one = Human()
#将对象同时赋值给另外一个变量
two = one
#print(one)
#主动删除对象
del one #删除变量,系统回收对象
del two

__call__

1.触发时机:将对象当作函数调用的时候自动触发

2.作用:常用于归结类/对象的操作步骤,方便后期掉用

3.参数:一个self接受当前对象,其余的参数根据需求添加

4.返回值:可以有,可以没有

5.注意事项:无

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Human:
#成员属性
name = '张三'
age = 18
sex = '男'

#成员方法
#魔术方法
def __call__(self,xs):
print('call方法被触发')
self.eat()
self.cry()
return xs

def eat():
print('吃货的世界我们不懂~')
def cry(self):
print('55555555~~~~')

zs = Human()
#对象能够使用()调用干嘛?
result = zs('善良') #正常情况下,对象不能当作函数调用
print(result)

__len__

1.触发时机:使用len函数检测对象的时候自动触发

2.作用:使得len可以检测对象中某个数据的信息

3.参数:一个self接受当前对象

4.返回值:必须有,必须是整型

5.注意事项:len检测什么有程序员自己决定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Car:
#成员属性
color = '黑色'
weight = '2T'
grand = '奥利奥'
circle = ['左前轮','右前轮','左后轮','右后轮']

#成员方法
#len魔术方法
def __len__(self):
#print('len方法被触发')
#返回轮子的个数
num = len(self.circle)
return num

def playmusic(self):
print('你存在我深深的脑海里~')
def move(self):
print('请注意倒车,请注意倒车')

#实例化一个对象
mycar = Car()
#可以使用len函数检测对象么?
result = len(mycar)
print(result)

'''
列表也是List类,我们定义的列表不就是List类的一个对象? 确确实实
'''

__str__

1.触发时机:使用print打印对象的时候自动触发

2.作用:可以定义打印对象显示的信息内容

3.参数:一个self接受当前对象

4.返回值:必须有,且必须是字符串类型

5.注意事项:除了print之外,使用str() 转换数据的时候也会触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Human:
#成员属性
color = '黄色'
sex = '女'
age = 18
name = '史珍香'

#成员方法
#__str__魔术方法
def __str__(self):#重载魔术方法__str__(继承自object类的)
print('str方法被触发')
return self.name

def eat(self):
print('真香~')
def smile(self):
print('哇哈哈哈哈哈哈')

#实例化对象
szx = Human()
#打印对象
print(szx) #输出返回值
#触发__str__第二个时机
str(szx) #类型转换,不输出返回

'''
我打印列表(List类的对象)?给我是真正列表内容
我打印字符串(Str类的对象),给我的是字符串的内容
'''