zoukankan      html  css  js  c++  java
  • 面向对象——类的内置方法(魔法方法)

    面向对象——类的内置方法(魔法方法)

    什么是类的内置方法?

    凡是在类内部定义,以 __ 开头,以 __结尾的方法都是类的内置方法,也称之为魔法方法

    类的内置方法会在某种条件满足下自动触发

    常用的内置方法

    __ init __()

    在调用类时自动触发。 通过产生的对象自动调用__ init__()

    class Demo(object):
    	def __init__(self):
        print("此处是__init__方法...")
    deom_obj = Demo()	# 此处是__init__方法...
    

    __ new__(cls, *args, **kwargs)

    在__ init __触发前,自动触发

    class Demo(object):
    
        def __init__(self):
            print("此处是__init__方法...")
    
        # __new__;在__init__触发前,自动触发
        def __new__(cls, *args, **kwargs):
            print("此处是__new__方法..")
            # Python内部通过object调用内部的__new__实现产生一个空对象
            return object.__new__(cls, *args, **kwargs)
        
    demo_obj = Demo()
    # 打印结果:
    # 此处是__new__方法..
    # 此处是__init__方法...
    

    __ getattr __(self, item)

    在 “对象.属性” 获取属性时,“属性没有” 时触发

    class Demo(object):   
        # 在 “对象.属性” 获取属性时,属性没有时触发
        def __getattr__(self, item):
            print("此处是__getattr__方法...")
            return 'Boom'   # return 想要返回的值
    deom_obj = Demo()
    print(deom_obj.x)
    # 打印结果:
    # 此处是__getattr__方法...
    # Boom
    

    __ getattribute __(self, item)

    在“对象.属性”获取属性时,有没有属性都会触发

    class Demo(object):
        # 在“对象.属性”获取属性时,无论属性“有没有”都会触发
        def __getattribute__(self, item):
            print("此处是__getattribute__方法...")
            return item
        
    deom_obj = Demo(5)
    print(deom_obj.x)
    # 打印结果:
    # 此处是__init__方法...
    # 此处是__getattribute__方法...
    # x
    

    __ setattr __(self, key, value)

    当“对象.属性 =属性值 ” 添加或修改属性时触发

    class Demo(object):
    
        def __init__(self, x):
            self.x = x
            print("此处是__init__方法...")
            
        def __setattr__(self, key, value):
            print("此处是__setattr__方法...")
            print(key, value)
            # 此处是对对象的名称空间---> 字典进行操作
            self.__dict__[key] = value
            print(key, value)
    
    deom_obj = Demo(5)
    deom_obj.y = 10
    # 打印结果:
    # 此处是__setattr__方法...
    # x 5
    # x 5
    # 此处是__init__方法...
    # 此处是__setattr__方法...
    # y 10
    # y 10
    

    __ call __(self, *args, **kwargs)

    在“对象+()”调用对象时触发

    class Demo(object):
        def __call__(self, *args, **kwargs):
            print("此处是__call__方法...")
            # 调用对象时的返回值
            return [1, 2, 3]
    deom_obj = Demo()
    print(deom_obj())
    # 打印结果:
    # 此处是__call__方法...
    # [1, 2, 3]
    

    __ str __(self)

    在打印对象时触发

    class Demo(object):
        def __str__(self):
            print("此处是__str__方法...")
            return "111"
    
    deom_obj = Demo()
    print(deom_obj)
    # 打印结果:
    # 此处是__str__方法...
    # 111
    

    __ getitem __(self, item)

    在对象通过“对象[key]”获取属性时触发

    class Demo(object):
        # 在对象通过“对象[key]”获取属性时触发
        def __getitem__(self, item):
            print("此处是__getitem__方法...")
            print(item)
            return self.__dict__[item]
    
    deom_obj = Demo()
    deom_obj.x = 10
    print(deom_obj["x"])
    # 打印结果:
    # 此处是__getitem__方法...
    # x
    # 10
    

    __ setitem __(self, key, value)

    在对象通过“对象[key] = value值”设置属性时触发

    class Demo(object):
        # 在对象通过“对象[key] = value值”设置属性时触发
        def __setitem__(self, key, value):
            print("此处是__setitem__方法...")
            print(key, value)
            self.__dict__[key] = value
            
    deom_obj = Demo()
    deom_obj["x"] = 20
    # 打印结果:
    # 此处是__setitem__方法...
    # x 20
    
  • 相关阅读:
    ubuntu创建桌面启动器
    UVA 题目11300 Spreading the Wealth
    js实现C#的Server.Encode和Server.Decode
    boost库在工作(20)线程之五
    rmmod: chdir(/lib/modules): No such file or directory
    例说uboot从命令到驱动
    java高级工程师struts的知识重点
    ThreadLocal简单学习
    [CSS]为什么不推荐在CSS中使用ID选择器
    laravel中将session由文件保存改为数据库保存
  • 原文地址:https://www.cnblogs.com/aheng/p/11959325.html
Copyright © 2011-2022 走看看