魔术方法(魔法函数):一种特殊的方法。

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

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)