python_魔术方法

系统 1590 0

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

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

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)

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论