魔术方法(魔法函数):一种特殊的方法。
特点:不需要人工调用,在特定的时刻自动执行。
1._init_ 初始化魔术方法 *****
1.触发时机:实例化对象之后触发
2.作用:为实例化的对象添加对象的所属成员。
3.参数:一个self 接受当前对象 其他的参数根据实例化的传参决定
4.返回值:无
5.注意事项:无
例:
class Name():
age = 18
def __init__(self,head):
self.sex = "男"
self.color = "black"
self.runs = self.run
print(head)
def run(self):
print("黑人跑的快")
name = Name("hair") #制作一个对象,对象初始化
print(name.__dict__)
name.runs()
2._new_ 构造方法 *****
1.触发时机:实例化对象的时候触发(在__init__之前)!
2.作用:管理控制对象的生成过程。
3.参数:一个cls接受当前类,其他的参数根据实例化的参数决定
4.返回值:可有可无 没有返回值,实例化结果为None
5.注意事项:new魔术方法跟init的魔术方法的参数一致(除了第一个)
生成对象用return object.__new__(cls)
例:
class YmPo(object):
def __new__(cls,name):
if name == "我":
return object.__new__(cls)
else:
pass
hanguo = YmPo("你") #先 生成对象,在初始化对象
print(hanguo)
单例设计模式:一个类无论实例化多少次,有且只有一个对象(使用__new__模式方法)
单例模式形成后,成员属性不变,成员属性的值改变
例:
class Text():
# 给成员属性name赋值为None
name = None
# 创建对象
def __new__(cls,name):
# 判断name属性是否是None
if cls.name == None:
# 通过父类object 中的__new__ 魔术方法创建对象,存储在当前类的成员属性name当中
cls.name = object.__new__(cls) #此处一定要用name接收返回值
# 把该类对象进行返回
return cls.name
def __init__(self,names):
self.mingzi = names
obj1 = Text("你好")
obj2 = Text("世界")
print(obj1.mingzi)
print(obj2.mingzi)
3._del_ 析构方法 ****
1.触发时机:对象被系统回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象(引用)被del的时候]
2.作用:回收程序使用过程的信息和变量等
3.参数:一个self接收当前对象
4.返回值:无
5.注意事项:无
例:
class Durk():
def __del__(self):
print("del被触发了")
yazi = Durk()
name = yazi
print("======================")
del yazi
print("***********************")
del name
print("------------------------")
4._call_
1.触发时机:将对象当作函数调用的时候自动触发
2.作用:常用于归结类/对象的操作步骤,方便后期调用
3.参数:一个self接受当前对象,其余的参数根据需求添加
4.返回值:可以有,可以没有
5.注意事项:无
class Computer():
name = "电脑"
def end(self):
print("工作结束了")
def __call__(self,sex):
print(sex)
self.run()
self.end()
return "打完收工"
def run(self):
print("开始工作啦")
#实例化
huipu = Computer()
res = huipu("此电脑年龄为2年")
# print(res)
5._len_
1.触发时机:使用len函数检测对象的时候自动触发
2.作用:使得len可以检测对象中某个数据的信息
3.参数:一个self接受当前对象
4.返回值:必须有,必须是整型(返回值就是检测的值)
5.注意事项:len检测什么由程序员自己决定
例:
class Tall():
def __init__(self):
self.name = "hello"
def __len__(self):
res = len(self.name)
return res
#实例化类
gao = Tall()
res = len(gao)
print(res)
6._str_
1.触发时机:使用print打印对象的时候自动触发,使用str()转换对象的时候也会触发
2.作用:可以定义打印对象显示的信息内容
3.参数:一个self接受当前对象
4.返回值:必须有,且必须是字符串类型(即显示的对象内容)
5.注意事项:无
例:
class Tall():
def __init__(self):
self.name = "hello"
def __str__(self):
return "这是一个实例化Tall得到的对象"
#实例化类
gao = Tall()
print(gao)
7._repr_
1.触发时机:在使用repr转换对象的时候自动触发
2.作用:可以设置repr函数操作对象的结果
3.参数:一个self接受有当前对象本身
4.返回值:有必须是字符串
5.注意事项:正常情况下,类中的__str__和__repr__魔术方法是完全一样的(字符串中的str和repr魔术方法就不一样。)
repr():将对象转化为供解释器读取的形式。
repr函数和str函数除了对字符串的处理,其他的是一致的.在类中定义魔术方法的时候想使用repr方法就得定义str魔术方法
例:
class Tall():
def __init__(self):
self.name = "hello"
def __repr__(self):
print("repr被触发")
return "这是一个实例化Tall得到的对象"
#实例化类
gao = Tall()
# res = repr(gao)
# print(res)
8._bool_
1.触发时机:使用bool() 转换对象的时候自动触发(一般情况下,对象转换的结果默认就是True)
2.作用: 用于控制检测对象成员的信息
3.参数:一个self接受当前对象
4.返回值:必须有且必须是布尔值
5.注意事项:无
class Tall():
def __init__(self,age):
self.name = "hello"
self.age = age
def __bool__(self):
print("bool被触发")
if self.age == "0":
return True
else:
return False
#实例化类
gao = Tall("0")
res = bool(gao)
print(res)